加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Winsock UDP数据包被丢弃?

发布时间:2020-12-16 05:37:47 所属栏目:百科 来源:网络整理
导读:我们在 Windows中通过UDP设置有一个客户端/服务器通信系统.我们面临的问题是,当吞吐量增长时,数据包正在下降.我们怀疑这是由于UDP接收缓冲区不断被轮询,导致缓冲区被阻塞并丢弃任何传入的数据包.读取这个缓冲区可能会导致传入的数据包被丢弃吗?如果是这样,
我们在 Windows中通过UDP设置有一个客户端/服务器通信系统.我们面临的问题是,当吞吐量增长时,数据包正在下降.我们怀疑这是由于UDP接收缓冲区不断被轮询,导致缓冲区被阻塞并丢弃任何传入的数据包.读取这个缓冲区可能会导致传入的数据包被丢弃吗?如果是这样,有什么选择来纠正这个问题?系统是用C写的.请让我知道,如果这太模糊,我可以尝试提供更多的信息.谢谢!

解决方法

Windows套接字中的默认套接字缓冲区大小为8k或8192字节.使用 setsockopt Windows功能来增加缓冲区的大小(参考SO_RCVBUF选项).

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

通常情况下,您需要两个线程.

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

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

作为测试,尝试对数据包的完整处理进行短路,并在每次接收到数据包时向控制台(或文件)写入消息.如果您可以成功地执行此操作而不丢弃数据包,那么将功能打破为“接收”线程和“处理”线程将有所帮助.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读