Размер буфера сокета не увеличивается

int n = 0;
if ( 0 != getsockopt(iSockFd,SOL_SOCKET,SO_RCVBUF, &n, sizeof(n)))
{
    printf("Get socket option failed, errno: %d\n",errno);
}
else
{
    printf("Current socket buff len = %d\n", n);
}
n = 225280;
if(0 != setsockopt(iSockFd, SOL_SOCKET, SO_RCVBUF, (const void *)&n, sizeof(n)))
{
    printf("setsock err errno %d\n", errno);
}
else
{
    printf("setsock opt success\n");
}
n = 0;
if ( 0 != getsockopt(iSockFd,SOL_SOCKET,SO_RCVBUF, &n, sizeof(n)))
{
    printf("Get socket option failed, errno: %d\n",errno);
}
else
{
    printf("After setting socket buff len = %d\n", n);
}

Выход -

Текущий бафф сокета len = 41600

успех успеха

После установки баффа сокета len = 41600.

Похоже, размер приемного буфера не увеличивается, есть идеи, почему это происходит?

Заранее спасибо!


person Pavan    schedule 18.11.2015    source источник
comment
Платформа может свободно корректировать фактическое значение вверх или вниз. В таком большом буфере сокета нет особого смысла.   -  person user207421    schedule 18.11.2015
comment
@Coder: Можете ли вы поделиться версией ядра Linux и конфигурациями в следующих файлах, чтобы получить лучшую картину: /proc/sys/net/ipv4/tcp_moderate_rcvbuf /proc/sys/net/ipv4/tcp_rmem /proc/sys/net/ ядро/rmem_default /proc/sys/net/core/rmem_max /proc/sys/net/ipv4/tcp_rmem   -  person Karthik Balaguru    schedule 18.11.2015


Ответы (2)


Если ядро ​​более новой версии (2.6.17 или выше), проверьте, включена ли автонастройка, проверив файл /proc/sys/net/ipv4/tcp_moderate_rcvbuf . Если значение tcp_moderate_rcvbuf равно 1, автонастройка включена. В таком сценарии буфер приема будет динамически обновляться ядром и привязан к значениям в /proc/sys/net/ipv4/tcp_rmem. Проверьте, достигнут ли этот предел.

Если ядро ​​более старой версии, проверьте, ограничен ли SO_RCVBUF значениями в /proc/sys/net/core/rmem_default и /proc/sys/net/core/rmem_max. В случае TCP также проверьте значение /proc/sys/net/ipv4/tcp_rmem.

Также обратите внимание, что «Ручная настройка размеров буфера сокета с помощью setsockopt() отключает автонастройку». Вот хорошая ссылка по настройке для Linux http://www.psc.edu/index.php/networking/641-tcp-tune

person Karthik Balaguru    schedule 18.11.2015
comment
Вы сами себе противоречите. Ваш первый абзац предлагает проверить автонастройку, но ваш последний абзац объясняет, что установка размера буфера отключает автонастройку. Итак, как автонастройка может предотвратить установку буфера сокета здесь, если код в вопросе отключит его? Автонастройка вообще не имеет отношения к вопросу. - person Mecki; 30.01.2019

Всегда смотрите, что написано на man странице:

SO_RCVBUF
Задает или получает максимальный буфер приема сокета в байтах. Ядро удваивает это значение (чтобы освободить место для служебной информации), когда оно устанавливается с помощью setsockopt(2), и это удвоенное значение возвращается с помощью getsockopt(2). Значение по умолчанию задается файлом /proc/sys/net/core/rmem_default, а максимально допустимое значение задается файлом /proc/sys/net/core/rmem_max. Минимальное (удвоенное) значение для этого параметра равно 256.

http://man7.org/linux/man-pages/man7/socket.7.html

Таким образом, существует верхний предел, и любая попытка установить большее значение автоматически завершится ошибкой, что означает, что ошибки не будет, просто размер не увеличивается. Такое ограничение существует почти во всех существующих системах, а не только в Linux. Также обратите внимание, что даже если ваш setsockopt() был успешным, getsockopt() вернет большее значение, потому что это значение внутренне удвоено (это эксклюзивно для Linux, другие системы этого не делают).

person Mecki    schedule 30.01.2019