套接字接收队列中有多少数据包或字节



SO_RCVBUF调用getsockopt将返回套接字接收缓冲区的分配大小。

我很想知道是否有可能查询在调用recvrecvfrom之前实际在缓冲区中有多少数据包(或字节)?如果它有帮助,我可以满足于Linux特定的答案。有问题的套接字是UDP,但我怀疑这对TCP来说无关紧要。

我问这个问题的原因只是为了测试和调试。我试图验证我对setsocktop(SO_RCVBUF)的调用是否设置了足够的大小。知道接收缓冲区是否接近其极限将验证是否设置了足够的大小。

在Windows上,您正在寻找的内容可以通过ioctlsocket(FIONREAD)WSAIoCtl(FIONREAD)获得,它们都返回完整缓冲数据的完整大小,即使在缓冲多个数据报消息时也是如此。但是,在Linux上没有等效的。还有ioctl(FIONREAD),它只返回下一个缓冲消息的大小。

在套接字上使用SIOCINQ ioctl()来了解排队传入字节的数量。

同样,SIOCOUTQ用于查询发送缓冲区

套接字接收缓冲区的足够大小由链路的带宽延迟积给出。带宽。字节/秒乘以延迟(以秒为单位)=缓冲区大小(以字节为单位)。这个想法是通知一个足够大的TCP窗口,以便发送方可以"填满管道"。您可以提前计算:您不需要在运行时对其进行调优。

最新更新