getsockopt () возвращает значение, в два раза превышающее значение, которое было ранее установлено setsockopt () - PullRequest
0 голосов
/ 22 января 2019

Я пытаюсь увеличить SO_RCVBUF для необработанного сокета, который я использую для взаимодействия с драйвером устройства linux. По умолчанию rmem_default/rmem_max оба слишком малы, 163840. Поэтому я использую следующий вопрос / ответы о переполнении стека , чтобы помочь мне. Все работает или, по крайней мере, выглядит так. Однако, когда я получаю значение, которое я установил для SO_RCVBUF, он возвращает значение, которое я установил * 2? Кто-нибудь знает, почему это так?

int recv_val = SOCK_RCV_BUF_MAX; socklen_t size = sizeof(recv_val);

if(setsockopt(sock_fd, SOL_SOCKET, SO_RCVBUF, &recv_val, size) < 0)
{
    fprintf(stderr, "Error setsockopt(SO_RCVBUF): %s\n", strerror(errno));
}
else
    printf("Set the SO_RCVBUF to %d\n", recv_val);

recv_val = 0;

if (getsockopt(sock_fd, SOL_SOCKET, SO_RCVBUF, &recv_val, &size) < 0)
{
    fprintf(stderr, "Error getsockopt(SO_RCVBUF): %s\n", strerror(errno));
}
else if(recv_val == SOCK_RCV_BUF_MAX)
{
    printf("Successfully set the buffer max to %d\n", SOCK_RCV_BUF_MAX);
}
else
    printf("Failed to set the buffer to max (%d), val = %d\n", SOCK_RCV_BUF_MAX, recv_val);

выход

Set the SO_RCVBUF to 64000000
Failed to set the buffer to max (64000000), val = 128000000

Изменение на recv_val = SOCK_RCV_BUF_MAX/2 выходы

Set the SO_RCVBUF to 32000000
Successfully set the buffer max to 64000000

Если я не установлю значение с помощью setsockopt () и вызову getsockopt () для моего сокета, я получу правильное значение по умолчанию

Failed to set the buffer to max (64000000), val = 163840

1 Ответ

0 голосов
/ 22 января 2019

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

То, что вы видите, на самом деле задокументированное поведение :

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...