getockopt SO_RECVBUF после выполнения набора показывает удвоенное значение в Linux?
При вызове setsockopt с SO_RECVBUF, затем оборачиваясь и вызывая getsockopt с SO_RECVBUF, кажется, он говорит мне, что он устанавливает размер буфера в два раза больше, чем я просил его установить. Кто-нибудь знает, почему это может быть?
рассматриваемый код:
https://gist.github.com/rdp/8443238
выход:
setting it as 2222
[udp @ 0x1a72ec0] end receive buffer size reported is 4444
Только в linux другие ОС сообщают об этом как о значении, которое я ему установил. Спасибо.
2 ответа
Выдержка из справочной страницы по Linux для сокета
SO_SNDBUF
Устанавливает или получает максимальный размер буфера отправки сокета в байтах. Ядро удваивает это значение (чтобы освободить место для накладных расходов на ведение бухгалтерского учета), когда оно установлено с помощью setsockopt(2), и это удвоенное значение возвращается getockopt(2). Значение по умолчанию задается файлом /proc/sys/net/core/wmem_default, а максимально допустимое значение задается файлом / proc / sys / net / core / wmem_max. Минимальное (удвоенное) значение для этой опции составляет 2048.
Итак, ядро удваивает значение, которое вы устанавливаете для своих внутренних целей.
Платформа может регулировать значение, которое вы поставляете вверх или вниз. Смотрите справочную страницу. Вы были ниже минимума платформы.
2222 слишком низко. Это должно быть больше похоже на 32к.