【发布时间】:2023-02-18 01:21:43
【问题描述】:
我有一个传感器,它通过 UDP 每秒发送 35336 字节长的消息 16 次,以及几条 800 字节以下的消息。 消息在 Wireshark 中清晰可见,并且以接近预期的速率到达。 当尝试使用 python 脚本抓取消息时,通常会错过大消息,有时成功抓取之间的间隔长达 10 秒。 将网络适配器上的 MTU 增加到最大值没有帮助。 执行相同操作的 C++ 程序表现同样糟糕。 最小的例子:
import socket
import struct
def grabber():
print("Grabbing")
MCAST_GRP = '224.0.2.2'
MCAST_PORT = 42102
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)
sock.bind(('', MCAST_PORT))
mreq = struct.pack("4sl", socket.inet_aton(MCAST_GRP), socket.INADDR_ANY)
sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)
i = 0
gap = 0
max_gap = 0
while True:
# print('grabbing')
i += 1
data, addr = sock.recvfrom(1024*1024)
ld = len(data)
if ld < 30000:
gap += 1
else:
print("=====long message=====")
gap = 0
max_gap = max(max_gap, gap)
print(f"{gap=} {max_gap=} {len(data)=}")
if __name__ == "__main__":
grabber()
我怀疑这是某种我不知道的配置问题或套接字模块的限制。
【问题讨论】:
-
35336 甚至比巨型帧都大,因此您最终会得到碎片化的 IP 数据包。发送方能否传输更小的 UDP 数据报?
-
最大的 UDP 数据报肯定是 65507 字节。
-
@dbush 不幸的是发件人不是用户可配置的。仔细检查后,问题源于掉落的碎片。
-
@quamrana 是的,消息完全在 udp 数据报的范围内
标签: python networking udp multicast