Размер буфера сокета не увеличивается
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, другие системы не делают этого).