簡體   English   中英

非阻塞UDP寫入返回的字節數是否少於請求的字節數?

[英]Can a Non Blocking UDP write return with fewer bytes than requested?

我有一個應用程序通過可以在單工(單向傳輸)或雙工模式(雙向)操作的鏈路發送數據從發送器到接收器的點對點。 在單工模式下,應用程序使用UDP發送數據,而在雙工模式下,它使用TCP。 由於TCP套接字上的寫入可能會阻塞,因此我們使用非阻塞IO(ioctl與FIONBIO - O_NONBLOCK並且此分發不支持fcntl)和select()系統調用以確定何時可以寫入數據。 如果網絡條件惡化,我們可以在超時后提前中止發送。 我想使用相同的基本代碼來進行發送,而是在更高抽象的TCP / UDP之間進行切換。 這對TCP很有用。

但是我擔心Non Blocking IO如何用於UDP套接字。 我可能正在錯誤地閱讀手冊頁,但由於write()可能返回指示發送的字節數少於請求的數量,這是否意味着客戶端將在其數據報中接收更少的字節? 要發送給定的數據緩沖區,可能需要多次寫入,這可能是因為我使用非阻塞IO。 我擔心這會轉化為客戶端收到的多個UDP數據報。

我是套接字編程的新手,所以如果在這里有一些誤解,請原諒我。 謝謝。

假設一個正確的(未損壞的)UDP實現,那么每個send / sendmsg / sendto將恰好對應於發送的一個完整數據報,並且每個recv / recvmsg / recvfrom將恰好對應於所接收的整個數據報。

如果無法完整傳輸UDP消息,則應收到EMSGSIZE錯誤。 由於網絡中某個點的大小,發送的消息可能仍然會失敗,在這種情況下它將無法到達。 但它不會分段交付(除非IP堆棧嚴重錯誤)。

一個好的經驗法則是將UDP有效負載大小保持在最多1400字節。 這是非常近似的,並為各種形式的隧道留下了很大的空間,以避免碎片化。

暫無
暫無

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

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