在 Linux 中,可以使用以下命令指定系统默认的网络数据包接收缓冲区大小,例如 UDP:
sysctl -w net.core.rmem_max=<value>
sysctl -w net.core.rmem_default=<value>
但我想知道,应用程序(例如,在 c
中)是否可以通过在运行时指定每个 UDP 套接字的接收缓冲区大小来覆盖系统的默认设置?
最佳答案
您可以增加默认值,但不能增加到超过最大值。使用 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
来调整缓冲区大小。
关于linux - 在 Linux 中运行时指定 UDP 接收缓冲区大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2090850/