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

che*_*che 15 sockets linux udp

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

我知道我可以通过SO_RCVBUFsocket选项获取队列大小,并ioctl(<sockfd>, SIOCINQ, &<some_int>)告诉我TCP套接字的信息.但对于UDP,SIOCINQ/ FIONREADioctl仅返回下一个待处理数据报的大小.有没有办法如何获得UDP的队列大小,而不必解析系统表,如/proc/net/udp

Set*_*ble 10

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

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

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

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

Linux的

值得注意的是,某些实现包括计数中的头或其他开销字节,而其他实现仅计算有效负载字节.Linux似乎返回有效负载大小,不包括IP头.

  • 根据[udp(7)](http://www.kernel.org/doc/man-pages/online/pages/man7/udp.7.html),我担心这不起作用:_"FIONREAD( SIOCINQ):以整数形式返回下一个待处理数据报的大小(以字节为单位),如果没有数据报待处理,则返回0."_ (2认同)
  • 我的坏:我忘记了`FIONREAD`在Linux上的工作方式与在*BSD和Solaris上的工作方式不同.我将编辑我的答案以显示平台差异. (2认同)

Edw*_*rdH 7

正如ldx所提到的,ioctl或getsockopt不支持它.在我看来,SIOCINQ的当前实现旨在确定读取整个等待缓冲区需要多少缓冲区(但我想它不是那么有用,因为它可以在读取到实际缓冲区之间进行更改读).

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

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

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