使用 UDP 的 Python 特定丢包

问题描述 投票:0回答:1

这很奇怪。

我在本地网络上有一个微控制器,它正在广播地址(192.168.1.255)上发送UDP数据。它发送对命令的响应(也通过 UDP 发送),然后每 5 秒生成一个数据报。

命令通过 UDP 发送到 23451,数据和命令响应在 12345 上接收。

使用第三方程序,我可以看到我的机器上接收到的所有命令、响应和数据。

但是,使用下面的代码,我总是可以收到数据,但我永远无法收到命令响应。

import socket


response_port = 12345
response_sock = socket.socket(socket.AF_INET, # Internet
                        socket.SOCK_DGRAM) # UDP
response_sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) # Set the SO_REUSEADDR option to True, so we don't get an error when we try to bind to the same port from another program
response_sock.bind(('', response_port))

while True:
    datagram, addr = response_sock.recvfrom(1024)
    print(addr, " : ",datagram)

对命令的响应(我无法收到)如下所示:ASCII 格式的

UDP-SPI_0002
,或十六进制格式的
55 44 50 2D 53 50 49 5F 30 30 30 32 00

数据(我可以收到)如下所示:

33 36 31 34 19 00 0B 00 06 00 02 00 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 15 18 00 00 F1 00 60 02 E2 64 44 58 D9 46 69 3F A5 29 EA 3F E8 A4 F5 3F 00 00 7E 00 37 00 07 00 00 00 79 02 10 4A

我遇到的困难是数据总是收到,但命令响应却从不收到。我尝试过的事情:

  • 禁用数据传输,只发送命令响应,没有任何作用。
  • 在设置
    recvfrom
    和发送命令之间插入延迟
  • recvfrom
    放在单独的线程中

这是一个本地网络,没有其他机器,也无法访问互联网。 为了确认,我可以可靠地看到来自另一个工具的数据和命令响应 (https://udp-test-tool.informer.com/) 我使用的是 Windows 10、Python 3.12

python udp packet-loss
1个回答
0
投票

也许这个:

  1. 套接字配置:您的套接字配置似乎适合接收 UDP 数据报。 SO_REUSEADDR 的使用是正确的,允许多个应用程序监听同一个端口。

  2. 端口号和地址:确保微控制器的命令响应发送到正确的端口和 IP 地址。由于您绑定到 ('', response_port),因此您的套接字正在侦听端口 12345 上的所有接口。确保您的微控制器正在向此端口发送响应。

  3. 防火墙或安全软件:有时,Windows 10 计算机上的防火墙或安全软件可能会阻止某些类型的传入流量。验证您的防火墙设置是否允许端口 12345 上的传入 UDP 流量。

  4. 网络配置:鉴于这是本地网络设置,网络配置应该不是一个重要问题。但是,请确保不存在可能影响流量的 IP 冲突或子网掩码问题。

  5. 命令格式和时序:如果发送到微控制器的命令格式不正确,或者存在时序问题,微控制器可能不会按预期响应。仔细检查命令的格式和时间。

  6. 数据包大小和缓冲区溢出:recvfrom(1024)中的缓冲区大小似乎足够,但要确保响应数据包不大于1024字节。数据包大小大于缓冲区可能会导致数据包截断。

© www.soinside.com 2019 - 2024. All rights reserved.