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

标签 linux sockets udp buffer

在 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/

相关文章:

Python socket gethostbyname() 只返回一个 IP 地址

linux - 串行端口 - 无法设置服务中心 SMSC 地址 - AT+CSCA?返回错误,smsd返回初始化错误

c++ - 在 C++ 中通过 UDP 发送字符串

ruby-on-rails - tmp/sockets/unicorn.sock 是否应该为我们的 unicorn 服务器的 capistrano 部署进行符号链接(symbolic link)

JavaFX 网络支持(TCP、UDP、SSH)?

java - 当消息太长时,log4j 不会记录整个消息

udp - 服务器作为 WebRTC 数据通道对等点

linux - ssh & perl & 在后台运行

linux - 如何在 Linux 中通过特定接口(interface)发送多播数据包

Linux将多个内部IP映射到一个外部IP