SO_RCVBUF的最小值是多少?

时间:2011-02-11 15:41:06

标签: c networking udp buffer system-calls

为了最大限度地减少延迟(我不关心数据包丢失)我希望UDP的接收缓冲区尽可能小。但是,当我将SO_RCVBUF设置为低于1000(使用setsockopt)时,我的程序永远不会收到任何数据包。我发送的数据报有28个字节的数据,总线上数据包大小为70个字节,所以如果SO_RCVBUF是< 1000?我该如何改变它,以允许更小的缓冲区大小?

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

3 个答案:

答案 0 :(得分:4)

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

相反,您需要每次都将所有可用数据包出列。这可以通过非阻塞套接字和边缘触发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

希望这有帮助。

答案 1 :(得分:0)

这很可能是特定于平台的,那么,您定位的平台是什么?

如果您使用的是Windows,我建议您使用重叠的I / O和I / O完成端口,将recv缓冲区设置为0并始终有多个待处理的RecvFrom()调用。

这应该a)当你没有RecvFrom()未决时,删除堆栈缓冲数据报的能力,b)允许你处理一些数据报。

然后,您调整未完成的重叠操作的数量,以便它总是比处理入站数据报的内核多一些,您应该得到您想要的。

答案 2 :(得分:0)

你的问题没有意义。减小缓冲区大小不会减少延迟。它只会增加传入数据报丢失的可能性,如果套接字接收缓冲区中没有空间,则会发生这种情况。关于两个同时传入的数据包的答案也没有意义。延迟是您处理传入数据的速度的函数,而不是缓冲区的大小。