【发布时间】:2011-01-06 15:29:03
【问题描述】:
在 Linux 中,可以使用以下命令为网络数据包(例如 UDP)指定系统的默认接收缓冲区大小:
sysctl -w net.core.rmem_max=<value>
sysctl -w net.core.rmem_default=<value>
但我想知道,应用程序(例如,c)是否可以通过在运行时指定每个 UDP 套接字的接收缓冲区大小来覆盖系统的默认值?
【问题讨论】:
在 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 开始,reasonable maximum buffer sizes 从 2.6.17 开始),它会根据负载自动调整接收缓冲区的大小。在具有自动调整功能的内核上,建议您不要使用setsockopt 设置接收缓冲区大小,因为这将禁用内核的自动调整功能。但是,在其他平台上可能仍需要使用 setsockopt 调整缓冲区大小。
【讨论】:
setsockopt 调整缓冲区大小;但在其他系统上,您可能仍然需要。
Socket.setReceiveBufferSize()、Socket.setSendBufferSize()、DatagramSocket.setReceiveBufferSize() 和 DatagramSocket.setSendBufferSize()。