2013-05-07 36 views
4

调用getsockoptSO_RCVBUF将返回分配的套接字接收缓冲区大小。套接字接收队列中有多少个数据包或字节?

我很想知道在调用recvrecvfrom之前是否可以查询缓冲区中有多少数据包(或字节)如果有帮助,我可以解决Linux特定的问题。有问题的套接字是UDP,但我怀疑它对于TCP来说并不重要。

我问的原因只是为了测试和调试目的。我试图验证,如果我的电话setsocktop(SO_RCVBUF)设置足够的大小。知道接收缓冲区是否接近达到其极限将验证是否设置了足够的大小。

回答

2

在Windows上,你正在寻找的是通过ioctlsocket(FIONREAD)WSAIoCtl(FIONREAD),这都返回完整的缓冲数据的全尺寸可用,即使在多个数据报消息缓冲。但是,在Linux上没有相应的功能。有ioctl(FIONREAD),它只返回下一个缓冲消息的大小。

0

套接字接收缓冲区的足够大小由链接的带宽延迟产品给出。带宽in。Bytes /秒延迟(以秒为单位)=缓冲区大小(以字节为单位)。这个想法是宣传一个足够大的TCP窗口,以便发送者可以“填充管道”。你可以预先计算出:你不需要在运行时调整它。大小为64k是好的。

+0

这是为UDP而不是TCP。发送者试图保持固定的比特率,但可以发送可能填满缓冲区的数据包突发。我试图找出接收缓冲区是否足以处理这个突发事件,或者如果我需要一个专用的线程与我自己的队列。最好不是。 – selbie 2013-05-07 23:51:14

+0

在这种情况下,请参阅@ nos的答案。我肯定会使用专用线程。 – EJP 2013-05-08 01:42:39

2

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

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

+0

这是一个好的开始。但根据您链接到的MAN页面,仅SIOCINQ“以毫秒为单位返回整数中下一个挂起数据报的大小,或者当没有数据报挂起时返回0”。换句话说,它会告诉你下一个recvfrom将返回多少个字节,但是之后没有关于队列的附加信息。那是对的吗? – selbie 2013-05-08 02:26:06