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

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

Успех

После установки сокета buff = 41600.

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

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

1 ответ

Если ядро ​​имеет более новую версию (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

Всегда смотрите, что 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, другие системы не делают этого).

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