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

Linux 如何获取UDP套接字的排队数据量?,linux,sockets,udp,Linux,Sockets,Udp,为了了解我在处理传入数据方面做得有多好,我想测量TCP和UDP套接字上的队列长度 我知道我可以通过sorcvbufsocket选项获取队列大小,ioctl(,SIOCINQ,&)告诉我TCP套接字的信息。但对于UDP,ioctl只返回下一个挂起数据报的大小。是否有一种方法可以获取UDP的队列大小,而不必解析系统表,如/proc/net/UDP?正如ldx所述,ioctl或getsockopt不支持该方法。 在我看来,SIOCINQ的当前实现旨在确定读取整个等待缓冲区所需的缓冲区数量(但我猜这并不

为了了解我在处理传入数据方面做得有多好,我想测量TCP和UDP套接字上的队列长度


我知道我可以通过
sorcvbuf
socket选项获取队列大小,
ioctl(,SIOCINQ,&)
告诉我TCP套接字的信息。但对于UDP,ioctl只返回下一个挂起数据报的大小。是否有一种方法可以获取UDP的队列大小,而不必解析系统表,如
/proc/net/UDP

正如ldx所述,ioctl或getsockopt不支持该方法。 在我看来,SIOCINQ的当前实现旨在确定读取整个等待缓冲区所需的缓冲区数量(但我猜这并不是很有用,因为它可以在读取缓冲区到实际读取缓冲区之间进行更改)

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

您可以通过“netstat-su”检查删除/错误,如果您只想监视机器状态,最好使用SNMP(udpInErrors)


顺便说一句:你总是可以选择破解内核代码并添加这个值(或其他值)。

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

平台,其中
FIONREAD
返回
SOCK_DGRAM
socket中所有挂起的数据:

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

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

Linux


可能还值得注意的是,一些实现在计数中包含头或其他开销字节,而其他实现只计算有效负载字节。Linux似乎返回有效负载大小,不包括IP头。

由于内核不支持此信息,您恐怕无法直接获取此信息。根据:“FIONREAD(SIOCINQ):以字节为单位返回下一个挂起数据报的大小,如果没有挂起数据报,则返回0。”我的缺点:我忘记了
FIONREAD
在Linux上的工作方式与在*BSD和Solaris上的工作方式不同。我将编辑我的答案以显示平台差异。