首页 > 解决方案 > 如何让 UDP 套接字丢弃最早排队的数据包而不是新的传入数据包?

问题描述

这是场景:我有一个实时(ish)GUI 显示,显示网络上服务器上某些传感器的当前状态,我需要显示尽可能低延迟,所以我的服务器是通过 UDP 数据包向客户端计算机发送高频更新。

有时(由于某些原因)客户端的 UDP 套接字的传入 UDP 数据包缓冲区 (SO_RECV) 可能会填满,此时缓冲区中没有空间容纳下一个传入数据包。在这种情况下,操作系统只是丢弃传入的数据包,然后生活继续。

...但是,对于我们试图最小化延迟的系统来说,这种行为并不理想,因为更有价值的“新鲜”数据包(其中包含最新的传感器值)已经丢失,为了保留套接字接收缓冲区中已经存在的现在冗余(因此无用)的“旧”数据。

所以问题是,有没有办法告诉 UDP 套接字,当它因为接收缓冲区已满而需要丢弃数据包时,它应该根据需要丢弃缓冲区中最旧的数据包,以便腾出空间新收到的数据包,而不是丢弃新数据包并保留旧数据包?(请注意,由于允许 UDP 出于任何原因随时丢弃任何数据包,因此没有理由不能这样做)

(我意识到我可以通过例如专用一个高优先级线程从 UDP 套接字读取,从而确保缓冲区永远不会填满,但这似乎是一个相当复杂和活泼的解决方法对于可以通过对套接字的内置缓冲逻辑进行简单调整来避免的问题)

标签: c++socketsudpbufferinglow-latency

解决方案


推荐阅读