У меня проблема с отсутствующими сообщениями при использовании неблокирующего чтения в udp между двумя хостами.Отправитель на Linux, а читатель на WinXP.Этот пример в python показывает проблему.
Вот три сценария, которые используются для показа проблемы.
send.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))
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> 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 тimes 9000
выше - последнее 10-байтовое сообщение отсутствует
ниже - 10-байтовое сообщение в середине отсутствует
recv: A times 10
recv: B times9000
recv: C времена 9000
recv: E времена 9000
recv: F времена 9000
recv: G времена 10
Я проверил Wireshark на окнах и каждый раз всесообщения перехватываются так, что они достигают интерфейса хоста, но не перехватываются read_nb.py.Какое объяснение?
Я также попытался с read_nb.py на Linux и send.py на Windows, и тогда это работает.Таким образом, я полагаю, что эта проблема как-то связана с winsock2
Или, может быть, я использую неблокирующий udp неправильно?