php udp 非阻塞,使用非阻塞udp读取时丢失消息
當在兩個主機之間使用非阻塞的udp讀取時,我有丟失消息的問題。發送者在linux上,讀取器在winxp上。python中的這個例子顯示了這個問題。
這里有三個腳本用于顯示問題。
發送.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))
讀取.pyimport 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)
讀取nb.pyimport 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>;讀取.py
從read.py中給出這個ok結果:
記錄:A乘以10
記錄:B乘以9000
接收:C乘以9000
接收:D乘以10
接收:E乘以9000
接收:F乘以9000
記錄:G乘以10
示例2(缺少消息):
在這種情況下,read_nb.py通常不會捕獲短消息
我舉了兩個例子來說明它的樣子。
ubuntu>;python send.py
winxp>;讀取nb.py
從read_nb.py給出此結果:
記錄:A乘以10
記錄:B乘以9000
接收:C乘以9000
接收:D乘以10
接收:E乘以9000
記錄:F乘以9000
上面是最后一條丟失的10字節消息
下面是中間缺少的10字節消息
記錄:A乘以10
記錄:B乘以9000
接收:C乘以9000
接收:E乘以9000
接收:F乘以9000
記錄:G乘以10
我已經在windows上與wireshark進行了檢查,每次捕獲所有消息時,它們都會到達主機界面,但不是由read_nb.py捕獲的。怎么解釋?
我還嘗試過在linux上使用read_nb.py,在windows上使用send.py,然后它就工作了。
所以我想這個問題和winsock2有關
或者我使用非阻塞udp的方式不對?
總結
以上是生活随笔為你收集整理的php udp 非阻塞,使用非阻塞udp读取时丢失消息的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php显示无法找到该网页,window_
- 下一篇: php中include和require,