使用SO_RCVBUF
调用getsockopt
将返回套接字接收缓冲区的分配大小。
我很想知道在调用recv
或recvfrom
之前是否可以查询缓冲区中有多less数据包(或字节)在缓冲区中? 如果有帮助,我可以解决Linux特定的答案。 有问题的套接字是UDP,但我怀疑这对于TCP来说并不重要。
我问的原因只是为了testing和debugging目的。 我试图validation,如果我的电话setsocktop(SO_RCVBUF)设置足够的大小。 知道接收缓冲区是否接近达到极限将validation是否设置了足够的大小。
在Windows上,通过ioctlsocket(FIONREAD)
和WSAIoCtl(FIONREAD)
可以找到ioctlsocket(FIONREAD)
,即使在缓冲多个数据报消息时,它们也会返回完整大小的完整缓冲数据。 但是,在Linux上没有相同的东西。 有ioctl(FIONREAD)
,它只返回下一个缓冲消息的大小。
使用套接字上的SIOCINQ ioctl()来了解排队传入字节的数量。
同样,有查询发送缓冲区的SIOCOUTQ。
该套接字接收缓冲区的足够大小由该链路的带宽延迟乘积给出。 带宽in。Bytes /秒延迟(秒)=缓冲区大小(以字节为单位)。 这个想法是广告一个足够大的TCP窗口,发件人可以“填充管道”。 你可以预先计算出来:你不需要在运行时调整它。 大小为64K是好的。