[英]UDP socket buffer overflow detection
我正在开发跨平台工具,该工具可以捕获具有各种比特率的多个udp流。 boost :: asio用于联网。 有什么方法可以检测udp缓冲区已满并且套接字上可能发生数据丢失的情况? 我现在看到的唯一方法是读取/ proc /%pid%/ net / udp,但正如您所知,它不适用于Windows :)。 另外,如果可能的话,我想使用增强功能。
如果需要此功能,则必须将其编码到正在使用的协议中。 UDP本身无法执行此操作。 例如,您可以在每个数据报中放置一个序列号。 丢失的数据报将对应于丢失的序列号。
我遇到了同样的问题(尽管对我来说是Linux特有的),尽管这个问题比较老,也可能会为其他人记录我的发现。
据我所知,尚没有可移植的方法来执行此操作,Boost也没有直接支持的方法。
也就是说,有一些特定于平台的方法。 在Linux中,可以通过设置SO_RXQ_OVFL套接字选项来完成,然后使用recvmsg()获取答复。 虽然它的文档很少,但是http://lists.openwall.net/netdev/2009/10/09/75可能会为您提供帮助。
首先避免这种情况的一种方法是增加接收缓冲区(我想您已经研究过了,但是为了完整起见包括了它)。 SO_RCVBUF选项似乎是跨平台支持得很好的。 http://pubs.opengroup.org/onlinepubs/7908799/xns/setsockopt.html http://msdn.microsoft.com/zh-cn/library/windows/hardware/ff570832(v=vs.85).aspx操作系统:es对此设置了上限,管理员可能必须提高该上限。 在Linux上,可以使用/ proc / sys / net / core / rmem_max来增加IE。
最后,让应用程序评估其“负载”的一种方法(可能具有大的输入缓冲区)可用于及早发现过载,它可以在异步操作之前和之后引入时间戳。 在伪代码中(不通过boost :: async修改):
work_time = 0
idle_time = 0
b = clock.now()
while running:
a = clock.now()
work_time += a-b
data = wait_for_input()
b = clock.now()
idle_time += b-a
process(data)
然后work_time / (work_time+idle_time)
,您可以检查并重置work_time / (work_time+idle_time)
。 如果接近1,您就知道您将要遇到麻烦了,可以发出警报或采取其他措施。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.