пропавшие без вести сообщений при чтении с неблокированием udp

У меня есть проблема с пропавшими без вести сообщений при использовании неблокирования чтения в 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 неправильный путь?

6
задан lgwest 18 October 2010 в 15:28
поделиться