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