为了最小化延迟(我不关心数据包丢失),我想要尽可能小的 UDP 接收缓冲区。但是,当我将 SO_RCVBUF 设置为低于 1000(使用 setsockopt)时,我的程序从未收到任何数据包。我发送的数据报有 28 个字节的数据,总的在线数据包大小为 70 个字节,那么如果 SO_RCVBUF < 1000,为什么我收不到任何东西?我该如何更改它以允许更小的缓冲区大小?
此外,是否可以根据数据包数量而不是字节数来设置缓冲区?或者有什么方法可以手动清空它?
最佳答案
缩小套接字接收缓冲区不会减少延迟。
相反,您每次都需要将所有可用数据包从队列中取出。这可以通过非阻塞套接字和边缘触发来实现 epoll
或 kqueue
- 读取“可读”事件,直到获得 EWOULDBLOCK
。
至于为什么您没有得到任何具有小 SO_RCVBUF
值的输入,请看这里 - http://vger.kernel.org/~davem/skb_sk.html ,这里 - http://lxr.linux.no/#linux+v2.6.37/include/net/sock.h#L621
希望这对您有所帮助。
关于c - SO_RCVBUF 的最小值是多少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4970977/