调用getsockopt
与SO_RCVBUF
将返回套接字的分配的大小接收缓冲区。
我很好奇,想知道是否有可能调用之前查询多少数据报数据包(或字节)实际上是在缓冲区recv
或recvfrom
? 如果有帮助,我可以解决一个Linux具体的答案。 有问题的插座是UDP,但我怀疑这会不会对TCP无所谓。
为什么我想问的原因是仅用于测试和调试。 我试图验证,如果我的呼吁setsocktop(SO_RCVBUF)是设置足够的足够大小。 知道,如果接收缓冲区是有史以来接近达到极限,如果有足够大小设置将验证。
在Windows上,你正在寻找的是通过提供ioctlsocket(FIONREAD)
和WSAIoCtl(FIONREAD)
它们都返回完整的缓冲数据的全尺寸,即使在多个数据报消息缓冲。 但是,在Linux上没有等价的。 有ioctl(FIONREAD)
其中仅返回下一个缓冲消息的大小。
使用SIOCINQ的ioctl()的插座,以了解输入的排队的字节的数量。
同样有SIOCOUTQ查询发送缓冲区。
为插座上的足够的尺寸接收缓冲器由该链接的带宽时延乘积给出。 带宽英寸字节/秒的时间以秒延迟=缓冲区大小以字节计。 我们的想法是通告TCP窗口足够大,发送者可以“补管”。 就可以计算出提前:你不需要调整它在运行时。 对64K大小都不错。