在兩臺主機之間使用udp中的非阻塞讀取時,丟失消息時出現問題。發件人在Linux上,讀者在winxp上。 python中的這個例子顯示了這個問題。
以下是用於顯示問題的三個腳本。
send.py:使用非阻塞udp讀取時丟失消息
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))
read.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>蟒send.py
WINXP>read.py
給從read.py此OK結果:
的recv:A倍10
的recv:B乘以9000
收件人:C次9000
收件人:D次10
收件人:E次9000
收件人:F次9000
的recv:3G時代10
實施例2(丟失消息):在這種情況下
短消息通常不會通過read_nb.py 被獲取,我給它如何可以像兩個例子。
的ubuntu>蟒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字節的消息CV:A倍10
的recv:B乘以9000
的recv:C倍9000
的recv:E時代9000
的recv:F倍9000
的recv:3G時代10
我已使用Wireshark上檢查窗口和每次捕獲所有消息,以便它們到達主機接口,但不被read_nb.py捕獲。什麼是解釋?
我也試圖與在Linux和send.py在Windows read_nb.py,然後它的作品。 所以我認爲這個問題與winsock2
或者也許我正在使用非阻塞udp錯誤的方式?
窗口:s.getsockopt(socket.SOL_SOCKET,socket.SO_RCVBUF)= 8192個字節。 ubuntu:buf = 112640 bytes – lgwest 2010-10-19 15:45:42
好的,這是問題所在。很高興知道。 – 2010-10-19 16:35:25
嗯,所以我建議的解決方案和尼古拉得到的答案,沒有公正:( – 2010-10-19 17:16:56