在Linux中指定运行时的UDP接收缓冲区大小

时间:2010-01-19 03:24:06

标签: linux sockets udp buffer

在Linux中,可以使用以下命令为网络数据包(例如UDP)指定系统的默认接收缓冲区大小:

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

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

1 个答案:

答案 0 :(得分:29)

您可以从默认值增加值,但不能将其增加到超出最大值。使用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来调整缓冲区大小。