2010-01-19 130 views
26

在Linux中,可以指定系统的默认接收缓冲区大小网络数据包,说UDP,使用以下命令:指定UDP在运行时的接收缓冲区大小在Linux中

sysctl -w net.core.rmem_max=<value> 
sysctl -w net.core.rmem_default=<value> 

但我不知道,是否有可能对于应用程序(例如,在c),通过在运行时指定每个UDP套接字的接收缓冲区大小来覆盖系统的默认值?

回答

28

您可以从默认值增加值,但不能将其增加到最大值以外。使用setsockopt改变SO_RCVBUF选项:

int n = 1024 * 1024; 
if (setsockopt(socket, SOL_SOCKET, SO_RCVBUF, &n, sizeof(n)) == -1) { 
    // deal with failure, or ignore if you can live with the default size 
} 

请注意,这是便携式解决方案;它应该在任何POSIX平台上工作以增加接收缓冲区大小。 Linux已经有autotuning一段时间了(自2.6.7以来,并且自从2.6.17开始使用reasonable maximum buffer sizes),它会根据负载自动调整接收缓冲区大小。在具有自动调整的内核上,建议您不要使用setsockopt来设置接收缓冲区大小,因为这将禁用内核的自动调整。但是,使用setsockopt来调整缓冲区大小在其他平台上可能仍然是必需的。

+0

正是我想要的:) 我也想知道,如果我指定缓冲区大小为一个小值,它会是静态的吗?或者系统会动态调整缓冲区的大小来处理流量压力(如果有的话)? – 2010-01-19 04:12:16

+0

我已经扩大了我的回答,提到Linux TCP自动调整;在Linux上,如果启用自动调整,则可能不应使用'setsockopt'调整缓冲区大小;但在其他系统上,您可能仍然想要。 – 2010-01-19 15:52:50

+4

autotuning仅适用于TCP,还是适用于TCP和UDP? – kumar 2010-06-29 14:27:44