UDP套接字缓冲区溢出检测
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/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,你就知道你有麻烦了,可以发出警报或采取其他措施。
- 将整型转换为浮点型时检测溢出
- 我很难理解这些关于检测整数溢出的评论
- 检测 32 位整数溢出
- 编译器是否有可能检测整数溢出或其他数据类型溢出的可能性
- 在发布模式下检测到缓冲区溢出 - linux
- 静态分析,用于检测 Visual Studio C++ 2012 上的缓冲区溢出
- 检测输入中的整数溢出
- 检测到缓冲区溢出
- C++大量(无符号长长)的溢出检测
- 0x00363A09处出现未处理的异常,堆栈cookie检测代码检测到基于堆栈的缓冲区溢出
- 如何为大型项目制作一个简单的工具来检测Linux中的双倍空闲或内存溢出
- 检测旧GLIBC版本的堆栈溢出
- 整数幂元函数:检测整数溢出
- 检测 Linux 上多线程C++应用程序中的堆栈溢出/覆盖
- 如何在命令行应用程序中检测堆栈溢出.在macos上用C++编写
- 溢出检测
- 冲突检测期间发生堆栈溢出错误
- 从istream中读取int,检测溢出
- UDP套接字缓冲区溢出检测
- 如何检测双精度浮点溢出和下溢