当前位置:  开发笔记 > 编程语言 > 正文

Winsock UDP数据包被丢弃了吗?

如何解决《WinsockUDP数据包被丢弃了吗?》经验,为你挑选了2个好方法。

我们在Windows中通过UDP设置建立了客户端/服务器通信系统.我们面临的问题是,当吞吐量增长时,数据包会被丢弃.我们怀疑这是由于UDP接收缓冲区不断被轮询导致缓冲区被阻塞并丢弃任何传入的数据包.是否有可能读取此缓冲区将导致传入的数据包被丢弃?如果是这样,有什么选择来纠正这个?该系统是用C语言编写的.请告诉我这是否过于模糊,我可以尝试提供更多信息.谢谢!



1> Matt Davis..:

Windows套接字中的默认套接字缓冲区大小为8k或8192字节.使用setsockopt Windows函数增加缓冲区的大小(请参阅SO_RCVBUF选项).

但除此之外,如果您没有足够快地读取数据包,增加接收缓冲区的大小只会延迟数据包再次丢弃的时间.

通常,您需要两种线程来处理这种情况.

第一个线程仅用于服务套接字.换句话说,线程的唯一目的是从套接字读取数据包,将其添加到某种正确同步的共享数据结构,发出已收到数据包的信号,然后读取下一个数据包.

存在第二个线程来处理接收的数据包.它处于空闲状态,直到第一个线程发出信号通知已收到数据包.然后,它从正确同步的共享数据结构中提取数据包并对其进行处理.然后等待再次发出信号.

作为测试,尝试短路数据包的完整处理,并在每次收到数据包时向控制台(或文件)写入消息.如果您可以在不丢弃数据包的情况下成功完成此操作,那么将您的功能分解为"接收"线程和"处理"线程将有所帮助.



2> Warren Young..:

是的,当缓冲区太满时,允许堆栈 - 静默地,甚至 - 丢弃数据包.这是UDP性质的一部分,这是您从TCP切换时放弃的可靠性之一.您可以通过添加重试逻辑,ACK数据包等来重新发明TCP - 或者您可以切换到SCTP之间的内容.

有一些方法可以增加堆栈的缓冲区大小,但这在很大程度上忽略了这一点.如果你没有足够快地读取以保持缓冲区空间可用,那么使缓冲区更大只会延长缓冲区空间耗尽的时间.正确的解决方案是在您自己的代码中创建更大的缓冲区,并将数据从堆栈的缓冲区移动到程序的缓冲区ASAP中,它可以等待任意长时间处理.

推荐阅读
jerry613
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有