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

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

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

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

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

Другие вопросы по тегам