在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_SNDBUF
和SO_RCVBUF
是通用套接字选项,而不是特定于 TCP 的选项。您正在获得(并尝试设置(与这些数字(TCP_SYNCNT
和TCP_LINGER2
在我的 linux 盒子上(相对应的 TCP 选项。难怪它失败了。
您需要使用SOL_SOCKET
作为 level 参数,而不是以SO_
开头的套接字选项。
my $snd_size = unpack("I", getsockopt(SOCK, SOL_SOCKET, SO_SNDBUF));