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

5
调用getsockopt函数并传入SO_RCVBUF参数,将返回套接字接收缓冲区分配的大小。
我想知道在调用recvrecvfrom之前是否有可能查询实际上已经存在于缓冲区中的数据报包(或字节数)的数量?如果需要,我可以接受Linux特定的答案。所涉及的套接字是UDP,但我认为对于TCP也没有关系。
我提出这个问题只是为了测试和调试目的。我正在尝试验证我的setsocktop(SO_RCVBUF)调用是否设置了足够大的大小。如果知道接收缓冲区是否接近达到其极限,就可以验证是否设置了足够的大小。
3个回答

3
在Windows上,您需要使用ioctlsocket(FIONREAD)WSAIoCtl(FIONREAD)来获取完整缓冲数据的大小,即使有多个数据报消息被缓冲。但是,在Linux上没有等效的功能。在Linux中只有ioctl(FIONREAD)可以使用,它只返回下一个缓冲消息的大小。

你对使用Netlink有什么想法?是否有API可以使用Netlink查找队列中数据的大小? - Jafar Gh

2
使用SIOCINQ ioctl()函数查询套接字上排队等待的入站字节数量。
类似地,用于查询发送缓冲区的SIOCOUTQ。

这是一个很好的开始。但根据你提供的MAN页面,SIOCINQ仅“返回下一个待处理数据报的大小(以字节为单位的整数),或者在没有待处理数据报时返回0。”换句话说,它告诉你下一个recvfrom将返回多少字节,但在此之后不提供有关队列的其他信息。这是正确的吗? - selbie

0

套接字接收缓冲区的足够大小由链路的带宽延迟乘积给出。 带宽(以字节/秒为单位)乘以延迟(以秒为单位)= 缓冲区大小(以字节为单位)。 这个想法是广告一个足够大的TCP窗口,以便发送方可以“填满管道”。 您可以提前计算它:您不需要在运行时进行调整。 朝着64k的尺寸很好。


这是针对UDP而非TCP的。发送方尝试维持固定比特率,但可能会发送一连串的数据包来填满缓冲区。我正在尝试弄清楚接收缓冲区是否足够处理这个突发情况,或者我是否需要一个专用线程和自己的队列。最好不要这样做。 - selbie
在这种情况下,请参考@nos的答案。但是我肯定会使用专用线程。 - user207421

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接