2 つのホスト間で udp でノンブロッキング読み取りを使用すると、メッセージが見つからないという問題があります。送信者は Linux 上にあり、リーダーは winxp 上にあります。Python のこの例は、問題を示しています。
問題を示すために使用される 3 つのスクリプトを次に示します。
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 からこの ok の結果を取得します。
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×9000
上記は最後の 10 バイトのメッセージがありません
以下は、中央が欠落している 10 バイトのメッセージです。
recv: A×10
recv: B×9000
recv: C×9000
recv: E×9000
recv: F×9000
recv: G×10
Windows で Wireshark を使用して確認したところ、すべてのメッセージがキャプチャされるたびにホスト インターフェイスに到達しますが、read_nb.py によってキャプチャされません。説明は何ですか?
また、Linux で read_nb.py を、Windows で send.py を試してみたところ、動作しました。したがって、この問題はwinsock2と関係があると思います
または、ノンブロッキング udp を間違った方法で使用している可能性がありますか?