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