当在两个主机之间使用非阻塞的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))
读取.pyimport 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)
读取nb.pyimport 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>;读取.py
从read.py中给出这个ok结果:
记录:A乘以10
记录:B乘以9000
接收:C乘以9000
接收:D乘以10
接收:E乘以9000
接收:F乘以9000
记录:G乘以10
示例2(缺少消息):
在这种情况下,read_nb.py通常不会捕获短消息
我举了两个例子来说明它的样子。
ubuntu>;python send.py
winxp>;读取nb.py
从read_nb.py给出此结果:
记录:A乘以10
记录:B乘以9000
接收:C乘以9000
接收:D乘以10
接收:E乘以9000
记录:F乘以9000
上面是最后一条丢失的10字节消息
下面是中间缺少的10字节消息
记录:A乘以10
记录:B乘以9000
接收:C乘以9000
接收:E乘以9000
接收:F乘以9000
记录:G乘以10
我已经在windows上与wireshark进行了检查,每次捕获所有消息时,它们都会到达主机界面,但不是由read_nb.py捕获的。怎么解释?
我还尝试过在linux上使用read_nb.py,在windows上使用send.py,然后它就工作了。
所以我想这个问题和winsock2有关
或者我使用非阻塞udp的方式不对?