gpt4 book ai didi

c++ - 阻止 UDP 数据包在接收缓冲区快满时被部分截断

转载 作者:太空宇宙 更新时间:2023-11-04 13:34:49 25 4
gpt4 key购买 nike

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

发生这种情况时,操作系统是否设置了任何标志供我阅读?理想情况下,如果它不适合接收缓冲区,我想强制操作系统丢弃整个数据包,而不是只接收其中的一部分。 IP_DONTFRAG 没有在我的系统上定义,所以我不知道该怎么做。我还会想出一种方法,使接收缓冲区大小成为我的数据包大小的倍数,这样数据包就不能部分放入缓冲区。克服这个问题的最佳方法是什么?

最佳答案

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

在发送端处理分段是 IP 的责任,IP 数据包可以达到 64K,并且将由 IP 分段以适应底层的 MTU。

在接收端发生相反的情况,重新组装。使用 UDP,您要么接收到整个数据包,要么什么也接收不到。 只接收其中一部分的唯一原因可能是您的应用程序接收缓冲区很小。一些套接字实现将其砍掉,即使所有内容都已收到

关于c++ - 阻止 UDP 数据包在接收缓冲区快满时被部分截断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29959690/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com