Как увеличить параметры сокета размера sndbuf / rcvbuf в модуле Perl Socket? - PullRequest
2 голосов
/ 09 октября 2019

В модуле сокетов Perl (v5.10) по умолчанию (по некоторым причинам) параметры сокетов sndbuf и rcvbuf имеют очень низкие значения: 5 и 60 байт соответственно. Когда я пытаюсь увеличить до более высокого значения (скажем, 4K), это не займет.

use Socket;

# *** someother code  ***

# Retrieve default values
my $snd_size = unpack("I", getsockopt(SOCK, $proto, SO_SNDBUF));
print "The default sndsize = $snd_size\n";

my $rcv_size = unpack("I", getsockopt(SOCK, $proto, SO_RCVBUF));
print "The default rcvsize = $rcv_size\n";


my $required_send_buf_size = 4096;
my $required_recv_buf_size = 4096;

my $pack_send = pack("I", $required_send_buf_size);
if (!setsockopt(SOCK, $proto, SO_SNDBUF, $pack_send))
{
    print("ERROR: Unable to set the SO_SNDBUF to $required_send_buf_size\n");
    close(SOCK);
    return;
}

$snd_size = unpack("I", getsockopt(SOCK, $proto, SO_SNDBUF));
print "The modified sndsize = $snd_size\n";


my $pack_recv = pack("I", $required_recv_buf_size);
if (!setsockopt(SOCK, $proto, SO_RCVBUF, $pack_recv))
{
    print("ERROR: Unable to set the SO_RCVBUF to $required_recv_buf_size\n");
    close(SOCK);
    return;
}

В приведенном выше коде оба вызова setsockopt () завершаются ошибкой.

1 Ответ

3 голосов
/ 10 октября 2019
$proto = getprotobyname('tcp');
...
my $snd_size = unpack("I", getsockopt(SOCK, $proto, SO_SNDBUF));

Там ваша проблема прямо здесь. SO_SNDBUF и SO_RCVBUF - это общие параметры сокетов, а не специфичные для TCP. Вы получаете (и пытаетесь установить) параметры TCP, соответствующие этим номерам (TCP_SYNCNT и TCP_LINGER2 на моем linux box.). Неудивительно, что он терпит неудачу.

Вам нужно использовать SOL_SOCKET в качестве аргумента уровня вместо параметров сокета, начинающихся с SO_.

my $snd_size = unpack("I", getsockopt(SOCK, SOL_SOCKET, SO_SNDBUF));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...