我正在开发跨平台的工具,可以捕获多个具有不同比特率的udp流。 boost :: asio用于联网。当udp缓冲区已满并且套接字上的数据丢失可能发生时,是否有任何方法可以检测到这种情况?我现在看到的唯一方法是读取/ proc /%pid%/ net/udp,但它不适用于windows,因为您知道:)。如果可能的话,我也想使用boost功能。UDP套接字缓冲区溢出检测
回答
如果您需要此功能,则必须将其编码到您正在使用的协议中。 UDP本身不能做到这一点。例如,您可以在每个数据报中添加一个序列号。缺少数据报将对应于缺少的序列号。
哦,使用这个解决方案很好,但我不能对协议进行修改。 – nameless
检查协议是否提供其他方法。如果没有办法评估数据是否被丢弃,很难想象一个协议如何有用。 –
我刚刚遇到了同样的问题(尽管对于我来说,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操作系统:es提出了一个上限,虽然,管理员可能必须增加。在Linux上,I.E.它可以使用/ proc/sys/net/core/rmem_max来增加。最后,您的应用程序评估其“负载”的一种方法是使用大输入缓冲区来提前检测重载,这可能是在异步操作之前和之后引入一个时间戳。在pseudo_code(无法提振::异步适应):
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,你就知道你正在惹麻烦,可以发出警报或采取其他行动。
谢谢你提到SO_RXQ_OVFL。只需补充一点,这里有一个有用的示例:https://github.com/linux-can/can-utils/blob/master/candump.c – DavidA
- 1. UDP服务器套接字缓冲区溢出
- 2. 没有填充接收缓冲区的UDP缓冲区溢出?
- 3. ***检测到缓冲区溢出***
- 4. 缓冲区溢出(VS)缓冲区溢出(VS)堆栈溢出
- 5. 缓冲区溢出
- 6. 缓冲区溢出缓冲区长度
- 7. Linux套接字缓冲区如何溢出?
- 8. .NET套接字缓冲区溢出没有错误
- 9. TCP套接字缓冲区和数据溢出
- 10. 套接字和缓冲区
- 11. 缓冲区溢出不溢出
- 12. 缓冲区溢出与gets()
- 13. PaX和缓冲区溢出
- 14. JSP缓冲区溢出
- 15. 缓冲区溢出攻击
- 16. 的strtok - 缓冲区溢出
- 17. 缓冲区溢出为homeowrk
- 18. 过程缓冲区溢出
- 19. 试验缓冲区溢出
- 20. C++溢出缓冲区
- 21. vi,vim缓冲区溢出
- 22. 缓冲区溢出 - linux 64bit
- 23. Flush tx udp套接字内核缓冲区以减少延迟
- 24. ReadDirectoryChangesW:异步使用时如何检测缓冲区溢出?
- 25. 在Ubuntu 10.10 32bit上构建gcc-4.0.4。缓冲区溢出检测
- 26. ***检测到缓冲区溢出***:php终止
- 27. 套接字接收缓冲区大小
- 28. C++套接字256字节缓冲区
- 29. 当Spring Boot连接时,MySQL崩溃,检测到“缓冲区溢出”
- 30. 推回缓冲区溢出 - 但我的缓冲区还未满?
那不会买你太多。您的本地缓冲区只是这些UDP数据包可能沿路由丢弃的许多地方之一。 – Mat
谢谢,我知道udp是什么。但是流是巨大的(几十/几百mbps),处理过程很复杂。因此,当没有足够的资源来处理这种数据量时,检测这种情况并不是坏事。 – nameless