我從我的服務器發送了兩種型別的資料包并嘗試分析:
長度為 27 個字(108 個位元組)的背景關系資料包
長度為 250 字(1000 位元組)的資料包
我正在使用 python 的 socket recvfrom() 方法,但關于此的檔案似乎很少。目前我有以下代碼片段:
import socket
rx_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
rx_socket.bind(("", 50000))
packets = []
for _ in range(10):
data, _ = rx_socket.recvfrom(8192)
packets.append(data)
我的問題是,packets串列中的每個資料包都是一個背景關系資料包。我知道這是因為每個元素的長度是 27。我需要能夠接收資料包,有沒有辦法在 recvfrom() 回傳之前指定最小位元組數?感謝您的任何幫助!
uj5u.com熱心網友回復:
有沒有辦法在 recvfrom() 回傳之前指定最小位元組數?
不能。只能指定要讀取的最大位元組數。
請注意,對于資料報(即 UDP),每個資料報都recv將回傳一個資料報,send并將發送在一個資料報中給出的所有內容,這也意味著send在一側和recv另一側之間存在 1:1 的關系。
此外,不可能根據大小選擇資料報并讓系統忽略其他資料報。一切都按照收到的順序傳送到套接字緩沖區(只要有空間)。獲取更大資料報的唯一方法是通過呼叫recv.
uj5u.com熱心網友回復:
我的問題是,
packets串列中的每個資料包都是一個背景關系資料包。我知道這是因為每個元素的長度是 27。
好吧,您只讀取了 10 個資料包,然后就停止了。data資料包是否有可能在資料包 10 之后到達?
我需要能夠接收
data資料包
recvfrom()您已經擁有的電話將非常適合該目的。您告訴使用 8K 緩沖區recvfrom()讀取下一個資料報。您的data資料包完全在該大小之內。
如果有的話,您唯一需要更改的是回圈條件,例如使用while True代替for _ in range(10).
如果您沒有收到任何data資料包,這意味著您要么在它們到達之前停止閱讀,要么根本沒有將它們發送到您的偵聽埠。使用資料包嗅探器(例如 Wireshark)來驗證這一點。
有沒有辦法在 recvfrom() 回傳之前指定最小位元組數?
不,那里沒有。recvfrom()無論大小如何,每次呼叫都會出列并回傳套接字上的下一個資料報。但是,如果資料報大于您指定的緩沖區大小,資料報將被截斷。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/377928.html
