在两台主机之间的 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 给出这个好的结果:
recv:A 乘以 10
recv:B 乘以 9000
recv:C 乘以 9000
recv:D 乘以 10
recv:E 乘以 9000
recv:F 乘以 9000
recv:G 乘以 10
示例 2(丢失消息):
在这种情况下,read_nb.py 通常不会捕获短消息我给出了两个示例来说明它的外观。
ubuntu > python send.py
winxp > read_nb.py
从 read_nb.py 给出这个结果:
recv:A 乘以 10
recv:B 乘以 9000
recv:C 乘以 9000
recv:D 乘以 10
recv:E 乘以 9000
recv:F 乘以 9000
以上是缺少的最后 10 字节消息
下面是中间缺失的 10 字节消息
recv:A 乘以 10
recv:B 乘以 9000
recv:C 乘以 9000
recv:E 乘以 9000
recv:F 乘以 9000
recv:G 乘以 10
我已经检查了 windows 上的wireshark,每次都捕获所有消息,以便它们到达主机接口但没有被 read_nb.py 捕获。解释是什么?
我也尝试过在 linux 上使用 read_nb.py 和在 windows 上使用 send.py,然后它就可以工作了。所以我认为这个问题与winsock2有关
或者,也许我以错误的方式使用非阻塞 udp?