簡體   English   中英

Datagramsocket:接收(...)如何處理數據包的碎片

[英]Datagramsocket: how receive(…) handles fragmentation of a packet

我從我的教授那里得知,使用UDP套接字發送的數據報包在較低層中被分段,並且可能在接收器端以多個數據包的形式到達。 例如,如果我在數據報包中發送1000字節數據,則在接收端它可能會以2字節,500字節,12字節等形式到達。 因此,他建議多次接收(...)接收發送方發送的整個1000字節的數據包。

后來當我瀏覽數據報套接字接收(...)的Java文檔時,有一行讀取如下:“此方法阻塞,直到收到數據報。...”是否表示收到整個數據報包當我們使用Java時,不需要進行多次接收(即使理論上是這種情況)?

PLS。 澄清。 如果每個數據包的多次接收(...)是解決此問題的唯一選擇,請參閱。 提出如何做到這一點的建議。

receive()任何調用都會給你一個完整的數據包 - 片段處理發生在套接字下面的兩層。 碎片和碎片整理發生在網絡/ Internet層( IP )中,因此套接字永遠不會看到碎片但只接收完整和完整的UDP / TCP數據包(只有完整的數據包才會被發送到監聽端口)。

所以,不,你不需要多個receive()來獲取單個數據包,但是你應該知道UDP不可靠,所以如果一個片段在網絡層中丟失(在某些情況下,如果它不按順序到達) ,你將無法獲得數據包。

如果您在接收數據包時遇到問題,您可能還需要檢查方法getReceiveBufferSize()setReceiveBufferSize() - 如果緩沖區大小小於數據包大小,則無法保證您可以接收數據包。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM