У меня есть проблема с пропавшими без вести сообщений при использовании неблокирования чтения в 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 (работает хорошо):
человечность> Python send.py
winxp> read.py
дайте это хорошо следует из read.py:
recv: времена 10
recv: B времена 9000
recv: C времена 9000
recv: D времена 10
recv: E времена 9000
recv: F времена 9000
recv: G времена 10
Пример 2 (недостающие сообщения):
в этом случае короткие сообщения не будут часто пойманы read_nb.py, который я даю двум примерам того, как он может быть похожим.
человечность> Python send.py
winxp> read_nb.py
дайте этот результат read_nb.py:
recv: времена 10
recv: B времена 9000
recv: C времена 9000
recv: D времена 10
recv: E времена 9000
recv: F времена 9000
выше последние 10-байтовые пропавшие без вести сообщения
ниже 10-байтовое сообщение в средних пропавших без вести
recv: времена 10
recv: B времена 9000
recv: C времена 9000
recv: E времена 9000
recv: F времена 9000
recv: G времена 10
Я сверился с wireshark на окнах и каждый раз, когда все сообщения получены так, они достигают, хост взаимодействуют через интерфейс, но не получен read_nb.py. Каково объяснение?
Я также попробовал read_nb.py на Linux и send.py на окнах, и затем он работает. Таким образом, я полагаю, что эта проблема имеет некоторое отношение к winsock2
Или возможно я использую неблокирование udp неправильный путь?