簡體   English   中英

當接收緩沖區快滿時,阻止UDP數據包被部分切斷

[英]Stopping UDP packets from being partially chopped off when receive buffer is almost full

我正在努力用C ++實現滑動窗口協議以進行分配。 我正在使用UDP(SOCK_DGRAM)套接字。 有時,程序必須背對背發送大量數據包(與窗口大小一樣大)。 到目前為止,我還沒有將窗口大小增加到超過30,但是最終應該可以達到256。 數據包大小必須從用戶輸入中獲取,因此可以是任何合理的值。 當數據包大小較小(例如512字節)時,就沒有問題。 當數據包較大時(例如40KB),前幾個數據包將被正確讀取,然后我的readNBytes()函數在僅讀取其中一部分后突然掛在其中一個上。 我假設操作系統的接收緩沖區已滿,並且其中一個數據包的一部分已被丟棄。 讀取將其放入緩沖區的部分,然后readNBytes()等待其余部分,該部分已被OS丟棄。

發生這種情況時,操作系統是否設置了供我讀取的標志? 理想情況下,如果不適合接收緩沖區,我想強迫OS丟棄整個數據包,而不僅僅是丟棄一部分。 IP_DONTFRAG沒有在我的系統上定義,所以我不知道該怎么做。 我還想辦法使接收緩沖區的大小是數據包大小的倍數,以使數據包不能部分放入緩沖區。 解決此問題的最佳方法是什么?

如果您的recv()緩沖區對於數據報而言太小,它將被截斷。 它不會引起阻塞。

您的數據報太大了。 IPv4限制為65507字節,但通常接受的實際限制為534字節。 您當然應該將它們保持在MTU路徑之內,否則您將保證碎片化,這只會增加數據報丟失的機會。

操作系統不會將一半數據包傳遞給應用程序。

IP負責在發送端處理分段,IP數據包最多可以達到64K,並且將被IP分段以適合基礎層的MTU。

在接收端,相反的情況發生了,重新組裝。 使用UDP,您要么收到整個數據包,要么什么也收不到。 僅接收其中一部分的唯一原因可能是您的應用程序接收緩沖區很小。 即使已收到所有內容,一些套接字實現也會將其砍掉

暫無
暫無

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

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