c - SO_RCVBUF 的最小值是多少?

标签 c networking udp buffer system-calls

为了最小化延迟(我不关心数据包丢失),我想要尽可能小的 UDP 接收缓冲区。但是,当我将 SO_RCVBUF 设置为低于 1000(使用 setsockopt)时,我的程序从未收到任何数据包。我发送的数据报有 28 个字节的数据,总的在线数据包大小为 70 个字节,那么如果 SO_RCVBUF < 1000,为什么我收不到任何东西?我该如何更改它以允许更小的缓冲区大小?

此外,是否可以根据数据包数量而不是字节数来设置缓冲区?或者有什么方法可以手动清空它?

最佳答案

缩小套接字接收缓冲区不会减少延迟。

相反,您每次都需要将所有可用数据包从队列中取出。这可以通过非阻塞套接字和边缘触发来实现 epollkqueue - 读取“可读”事件,直到获得 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/

相关文章:

C 自动测试客户端服务器程序

Python UDP广播

c - recvfrom() 中的 addrlen 字段是做什么用的?

c - 结构值以意想不到的方式从一个函数更改为另一个函数

c - 在公共(public) block 中有全局变量是一种未定义的行为吗?

iOS - 从套接字获取 CFReadStream/CFWriteStream

ubuntu - spark start-slave 未连接到主控

c - 我的 strlcpy 版本

c - 在 C 中重新分配 void 指针

multithreading - 消息传递任意对象图?