日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > php >内容正文

php

php udp 非阻塞,使用非阻塞udp读取时丢失消息

發布時間:2024/8/1 php 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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读取时丢失消息的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。