如何让 UDP 套接字丢弃最旧排队的数据包而不是新的传入数据包?

问题描述

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

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

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

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

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

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...