Указание размера буфера приема UDP во время выполнения в Linux - PullRequest
26 голосов
/ 19 января 2010

В Linux можно указать размер системного буфера приема по умолчанию для сетевых пакетов, скажем, UDP, используя следующие команды:

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

Но мне интересно, возможно ли это для приложения (скажем, вc) переопределить системные настройки по умолчанию, указав размер буфера приема на сокет UDP во время выполнения?

1 Ответ

29 голосов
/ 19 января 2010

Вы можете увеличить значение по умолчанию, но вы не можете увеличить его сверх максимального значения. Используйте 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 уже некоторое время есть автонастройка (начиная с 2.6.7 и с разумными максимальными размерами буфера с 2.6.17), что автоматически регулирует размер принимаемого буфера в зависимости от нагрузки. В ядрах с автонастройкой рекомендуется не устанавливать размер приемного буфера с помощью setsockopt, так как это отключит автонастройку ядра. Однако использование setsockopt для настройки размера буфера все еще может быть необходимо на других платформах.

...