2013-06-25 55 views
4

我的印象是recvfrom()給你下一個IP包的端口和它正在監聽的端口,如果它不在監聽包錯過。我們遇到了一個問題,即問題可能是數據包排隊等待recvfrom(),因此即使recvfrom()未處於有效偵聽狀態,它仍在偵聽並捕獲所有數據包。python的recvfrom()隊列包?

我無法在此找到明確的文檔。有人確實知道recvfrom()的特性是在不被調用時對數據包進行排隊嗎?

代碼示例:

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 

mcast_g = socket.inet_aton(group) 
mreq = struct.pack('4sL', mcast_g, socket.INADDR_ANY) 
s.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq) 

s.bind(('', port)) 

while True: 
    data, sender = s.recvfrom(1500) 
    # Do stuff 
    # Are packets being queued up here? 

回答

4

內核中有一個套接字接收緩衝區。 recv()和朋友從緩衝區中讀取數據,或者在空閒時阻止。如果讀取速度不夠快,則會填充緩衝區,並且丟棄緩衝區滿時到達的UDP數據報。你可以通過套接字選項來改變緩衝區的大小SO_RCVBUFSIZE.

+0

好吧,你如何描述它對我來說很有意義。謝謝! – gaucho

0

它不依賴於操作系統實現,但也存在緩衝上最先進的操作系統的數量。

+0

所以你說什麼操作系統的IP堆棧排隊消息是完全獨立於recvfrom()的行爲。如果操作系統正在排隊消息,則recvfrom()不關心。它只需從堆棧中接收下一條消息。 – gaucho

+1

'recvfrom()'是操作系統的*部分*。試圖將它們作爲兩個不合作的實體來討論它們是沒有意義的。如果操作系統有一個緩衝區(並且基本上都是這樣),那麼緩衝區就是'recvfrom()'從中獲取數據的地方。 –

+0

我沒有看到史蒂夫在哪裏說了什麼。我會提醒你不要習慣於「所以你在說」。結果總是一個錯誤。 – EJP