Подтвердить что ты не робот

Указание размера буфера приема UDP во время выполнения в Linux

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

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

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

4b9b3361

Ответ 1

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