如何获得UDP套接字的排队数据量?

为了看看我在处理传入数据方面做得如何,我想测量我的TCP和UDP套接字的队列长度。

我知道我可以通过SO_RCVBUF套接字选项获得队列大小,并且ioctl(<sockfd>, SIOCINQ, &<some_int>)告诉我有关TCP套接字的信息。 但对于UDP, SIOCINQ / FIONREAD ioctl只返回下一个未决数据报的大小。 有没有办法如何获得UDP的队列大小,而不必分析系统表,如/proc/net/udp

Solutions Collecting From Web of "如何获得UDP套接字的排队数据量?"

正如ldx所提到的,它不是通过ioctl或getsockopt来支持的。 在我看来,目前SIOCINQ的实现是为了确定需要多少缓冲区来读取整个等待缓冲区(但是我想它并不是那么有用,因为它可以在读取它到实际的缓冲区读)。

还有很多其他的遥测器,虽然这样的系统调用不支持,我想在正常的生产使用中没有真正的需要。

您可以通过“netstat -su”检查丢弃/错误,如果您只是想监视机器状态,可以使用SNMP(udpInErrors)更好地检查。

顺便说一句:你总是有选择在内核代码破解并添加此值(或其他)。

FWIW,我做了一些实验来绘制FIONREAD在不同平台上的行为。

FIONREAD返回SOCK_DGRAM套接字中的所有待处理数据的平台:

Mac OS X,NetBSD,FreeBSD,Solaris,HP-UX,AIX,Windows

FIONREAD仅返回第一个未决数据报的字节的平台:

Linux的

也可能值得注意的是,一些实现在计数中包含标题或其他开销字节,而另一些实施例仅对有效负载字节进行计数。 Linux似乎会返回有效负载大小,不包括IP标头。