Я пытаюсь увеличить 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