10 c udp winsock network-protocols
我们在Windows中通过UDP设置建立了客户端/服务器通信系统.我们面临的问题是,当吞吐量增长时,数据包会被丢弃.我们怀疑这是由于UDP接收缓冲区不断被轮询导致缓冲区被阻塞并丢弃任何传入的数据包.是否有可能读取此缓冲区将导致传入的数据包被丢弃?如果是这样,有什么选择来纠正这个?该系统是用C语言编写的.请告诉我这是否过于模糊,我可以尝试提供更多信息.谢谢!
Mat*_*vis 12
Windows套接字中的默认套接字缓冲区大小为8k或8192字节.使用setsockopt Windows函数增加缓冲区的大小(请参阅SO_RCVBUF选项).
但除此之外,如果您没有足够快地读取数据包,增加接收缓冲区的大小只会延迟数据包再次丢弃的时间.
通常,您需要两种线程来处理这种情况.
第一个线程仅用于服务套接字.换句话说,线程的唯一目的是从套接字读取数据包,将其添加到某种正确同步的共享数据结构,发出已收到数据包的信号,然后读取下一个数据包.
存在第二个线程来处理接收的数据包.它处于空闲状态,直到第一个线程发出信号通知已收到数据包.然后,它从正确同步的共享数据结构中提取数据包并对其进行处理.然后等待再次发出信号.
作为测试,尝试短路数据包的完整处理,并在每次收到数据包时向控制台(或文件)写入消息.如果您可以在不丢弃数据包的情况下成功完成此操作,那么将您的功能分解为"接收"线程和"处理"线程将有所帮助.
对此不确定,但在 Windows 上,不可能轮询套接字并导致数据包丢失。Windows 会与您的轮询分开收集数据包,因此不会导致任何丢失。
我假设您使用 select() 来轮询套接字?据我所知,不会造成下降。