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

时间:2013-05-07 20:19:31

标签: linux sockets udp

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

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

我提出的原因仅用于测试和调试目的。我正在尝试验证我对setsocktop(SO_RCVBUF)的调用是否设置了足够的大小。知道接收缓冲区是否接近其极限将验证是否设置了足够的大小。

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:2)

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

答案 2 :(得分:0)

套接字接收缓冲区的足够大小由链路的带宽延迟产品给出。带宽输入。字节数/秒延迟秒数=缓冲区大小(以字节为单位)。我们的想法是宣传一个足够大的TCP窗口,使发送者可以“填充管道”。您可以提前计算:您不需要在运行时调整它。朝向64k的尺寸很好。