我正在开发跨平台工具,可捕获具有各种比特率的多个udp流。 boost :: asio用于网络。当udp缓冲区已满并且套接字上的数据丢失可能发生时,有没有办法检测这种情况?我现在能看到的唯一方法是读取/ proc /%pid%/ net / udp,但是对于Windows来说它并不适用于你知道:)。如果可能的话,我还想使用提升功能。
答案 0 :(得分:2)
如果您需要此功能,则必须将其编码为您正在使用的协议。 UDP本身无法做到这一点。例如,您可以在每个数据报中放置一个序列号。丢失的数据报将对应于丢失的序列号。
答案 1 :(得分:1)
我刚刚遇到了同样的问题(虽然对我来说是针对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中(不是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,你知道你正在找麻烦,可以发出警报或采取其他行动。