2011-11-06 125 views
0

我正在开发跨平台的工具,可以捕获多个具有不同比特率的udp流。 boost :: asio用于联网。当udp缓冲区已满并且套接字上的数据丢失可能发生时,是否有任何方法可以检测到这种情况?我现在看到的唯一方法是读取/ proc /%pid%/ net/udp,但它不适用于windows,因为您知道:)。如果可能的话,我也想使用boost功能。UDP套接字缓冲区溢出检测

+3

那不会买你太多。您的本地缓冲区只是这些UDP数据包可能沿路由丢弃的许多地方之一。 – Mat

+0

谢谢,我知道udp是什么。但是流是巨大的(几十/几百mbps),处理过程很复杂。因此,当没有足够的资源来处理这种数据量时,检测这种情况并不是坏事。 – nameless

回答

2

如果您需要此功能,则必须将其编码到您正在使用的协议中。 UDP本身不能做到这一点。例如,您可以在每个数据报中添加一个序列号。缺少数据报将对应于缺少的序列号。

+0

哦,使用这个解决方案很好,但我不能对协议进行修改。 – nameless

+0

检查协议是否提供其他方法。如果没有办法评估数据是否被丢弃,很难想象一个协议如何有用。 –

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(无法提振::异步适应):

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,你就知道你正在惹麻烦,可以发出警报或采取其他行动。

+0

谢谢你提到SO_RXQ_OVFL。只需补充一点,这里有一个有用的示例:https://github.com/linux-can/can-utils/blob/master/candump.c – DavidA