gpt4 book ai didi

python - 使用非阻塞 udp 读取时丢失消息

转载 作者:太空狗 更新时间:2023-10-30 00:33:47 25 4
gpt4 key购买 nike

在两台主机之间使用 udp 中的非阻塞读取时,我遇到丢失消息的问题。发件人在linux上,读者在winxp上。 python 中的这个示例显示了问题。
以下是用于显示问题的三个脚本。
发送.py:

import socket, sys
s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
host = sys.argv[1]
s.sendto('A'*10, (host,8888))
s.sendto('B'*9000, (host,8888))
s.sendto('C'*9000, (host,8888))
s.sendto('D'*10, (host,8888))
s.sendto('E'*9000, (host,8888))
s.sendto('F'*9000, (host,8888))
s.sendto('G'*10, (host,8888))

读取.py

import socket
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.bind(('',8888))
while True:
data,address = s.recvfrom(10000)
print "recv:", data[0],"times",len(data)

read_nb.py

import socket
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.bind(('',8888))
s.setblocking(0)
data =''
address = ''
while True:
try:
data,address = s.recvfrom(10000)
except socket.error:
pass
else:
print "recv:", data[0],"times",len(data)

示例 1(工作正常):

ubuntu> python send.py
winxp > read.py

从 read.py 给出这个 ok 的结果:

recv: A 乘以 10
接收:B倍9000
接收:C 倍 9000
接收:D 倍 10
接收:E次9000
接收:F 次 9000
接收:G 乘以 10

示例 2(丢失消息):
在这种情况下,短消息通常不会被 read_nb.py 捕获我举了两个例子来说明它的样子。

ubuntu> python send.py
winxp > read_nb.py

从 read_nb.py 给出这个结果:

recv: A 乘以 10
接收:B倍9000
接收:C 倍 9000
接收:D 倍 10
接收:E次9000
接收:F 次 9000

上面是丢失的最后 10 字节消息

下面是中间少了一个10字节的消息

recv: A 乘以 10
接收:B倍9000
接收:C 倍 9000
接收:E次9000
接收:F 次 9000
接收:G 乘以 10

我已经在 Windows 上使用 wireshark 检查过,每次捕获所有消息时,它们都会到达主机接口(interface),但不会被 read_nb.py 捕获。解释是什么?

我也尝试过在 Linux 上使用 read_nb.py 并在 Windows 上使用 send.py,然后它就可以工作了。所以我认为这个问题与winsock2有关

或者我使用非阻塞 udp 的方式不对?

最佳答案

UDP 丢失消息是正常的——传输层不保证数据报的顺序或传递。如果您希望它们按顺序和/或始终交付,请切换到 TCP 或自己实现排序和/或确认/超时/重传。

以您的示例为例 - 大消息大于 1500 的普通以太网 MTU 减去 8 个字节的 UDP header (除非您使用的是巨型帧),因此将被发件人分段。这会给发送方和接收方带来更多负载,但也会给接收方带来更多负载,因为它需要将片段保存在内核内存中,直到完整的数据报到达。

我怀疑你是否溢出了 36030 字节的接收缓冲区,但我从来没有在 Windows 上进行过网络连接,所以你最好按照@Len 的建议检查接收器上 SO_RECVBUF 套接字选项的值。

同时检查 netstat -s 的输出查看丢弃的数据包计数。

关于python - 使用非阻塞 udp 读取时丢失消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3960680/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com