当接收缓冲区几乎已满时,阻止UDP数据包被部分切断

时间:2015-04-30 05:29:09

标签: c++ sockets udp buffering

我正在使用C ++实现滑动窗口协议以进行赋值。我正在使用UDP(SOCK_DGRAM)套接字。有时,程序必须背靠背地发送大量数据包(与窗口大小一样大)。到目前为止,我还没有将窗口大小增加到30,但它最终应该能够达到256。数据包大小必须取自用户输入,因此它可能是合理的。当数据包大小很小时,如512字节,没有问题。当数据包大小较大时(如40KB),前几个数据包被正确读取,然后突然我的readNBytes()函数在只读取其中一部分后挂起其中一个。我假设正在填充操作系统的接收缓冲区,并且其中一个数据包的一部分被丢弃。读取进入缓冲区的部分,然后readNBytes()等待其余部分,操作系统将其丢弃。

当发生这种情况时,操作系统是否设置了任何标记供我阅读?理想情况下,我想强制操作系统丢弃整个数据包,如果它不适合接收缓冲区,而不是仅仅参与其中。 IP_DONTFRAG未在我的系统上定义,因此我不知道如何执行此操作。我还想找到一种方法使接收缓冲区大小为我的数据包大小的倍数,这样一个数据包就不能部分地适应缓冲区。克服这个问题的最佳方法是什么?

2 个答案:

答案 0 :(得分:0)

如果您的recv()缓冲区对于数据报来说太小,它将被截断。它不会导致阻塞。

您的数据图太大了。 IPv4限制为65507字节,但通常接受的实际限制为534字节。您当然应该将它们保持在MTU路径下,否则您将保证碎片化,这只会增加数据报丢失的可能性。

答案 1 :(得分:0)

操作系统不会将半个数据包传递给应用程序。

IP负责处理发送方的分段,IP数据包可以达到64K,并且将被IP分段以适应底层的MTU。

在接收方,相反的情况发生,重新组装。使用UDP,您可以收到整个数据包,也可以不收到任仅接收其中一部分的唯一原因可能是您的应用程序接收缓冲区很小。即使已收到所有内容,一些套接字实现也会将其删除