调用getsockopt
withSO_RCVBUF
将返回套接字接收缓冲区的分配大小。
我很想知道在调用之前是否可以查询缓冲区中实际有多少数据报包(或字节recv
)recvfrom
?如果有帮助,我可以接受 Linux 特定的答案。有问题的套接字是 UDP,但我怀疑它对 TCP 无关紧要。
我问的原因只是为了测试和调试目的。我正在尝试验证我对 setsocktop(SO_RCVBUF) 的调用是否设置了足够的大小。知道接收缓冲区是否接近达到其限制将验证是否设置了足够的大小。
在 Windows 上,您可以通过ioctlsocket(FIONREAD)
和找到您要查找的内容WSAIoCtl(FIONREAD)
,它们都返回完整缓冲数据的完整大小,即使缓冲了多个数据报消息也是如此。但是,Linux 上没有等价物。有ioctl(FIONREAD)
,它只返回下一个缓冲消息的大小。
使用套接字上的SIOCINQ ioctl() 来了解排队的传入字节数。
同样,还有用于查询发送缓冲区的 SIOCOUTQ。
套接字接收缓冲区的足够大小由链路的带宽延迟乘积给出。带宽 in. Bytes/second 时间延迟(以秒为单位) = 缓冲区大小(以字节为单位)。这个想法是宣传一个足够大的 TCP 窗口,以使发送者可以“填满管道”。您可以提前计算:您不需要在运行时调整它。接近 64k 的尺寸很好。