UDP套接字缓冲区溢出检测

UDP socket buffer overflow detection

本文关键字:检测 溢出 缓冲区 套接字 UDP      更新时间:2023-10-16

我正在开发跨平台工具,可以捕获多种不同比特率的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/en-us/library/windows/hardware/ff570832(v=vs.85).aspx OS:es对此设置了上限,管理员可能需要增加这个上限。在Linux上,也就是说,它可以使用/proc/sys/net/core/rmem_max来增加。

最后,应用程序评估其"负载"的一种方法是在异步操作之前和之后引入时间戳,这种方法具有较大的输入缓冲区,可以用于早期检测过载。在pseudo_code中(不是boost::async-adapted):

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)。如果它接近1,你就知道你有麻烦了,可以发出警报或采取其他措施。