如何在 Perl 套接字模块中增加 sndbuf/rcvbuf 大小的套接字选项?



在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_sizen";
my $rcv_size = unpack("I", getsockopt(SOCK, $proto, SO_RCVBUF));
print "The default rcvsize = $rcv_sizen";

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_sizen");
close(SOCK);
return;
}
$snd_size = unpack("I", getsockopt(SOCK, $proto, SO_SNDBUF));
print "The modified sndsize = $snd_sizen";

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_sizen");
close(SOCK);
return;
}

在上面的代码中,两个 setsockopt(( 调用都失败了。

$proto = getprotobyname('tcp');
...
my $snd_size = unpack("I", getsockopt(SOCK, $proto, SO_SNDBUF));

那里有你的问题。SO_SNDBUFSO_RCVBUF是通用套接字选项,而不是特定于 TCP 的选项。您正在获得(并尝试设置(与这些数字(TCP_SYNCNTTCP_LINGER2在我的 linux 盒子上(相对应的 TCP 选项。难怪它失败了。

您需要使用SOL_SOCKET作为 level 参数,而不是以SO_开头的套接字选项。

my $snd_size = unpack("I", getsockopt(SOCK, SOL_SOCKET, SO_SNDBUF));

相关内容

最新更新