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头.
正如ldx所提到的,ioctl或getsockopt不支持它.在我看来,SIOCINQ的当前实现旨在确定读取整个等待缓冲区需要多少缓冲区(但我想它不是那么有用,因为它可以在读取到实际缓冲区之间进行更改读).
虽然有这样的系统调用,但还有许多其他遥测技术不受支持,我想在正常的生产使用中并没有真正的需要.
如果您只想监视机器状态,可以通过"netstat -su"检查丢弃/错误,或者更好地使用SNMP(udpInErrors).
顺便说一句:你总是可以选择破解内核代码并添加这个值(或其他).
| 归档时间: |
|
| 查看次数: |
11090 次 |
| 最近记录: |