getsockopt SOCKET,LEVEL,OPTNAME

查询与 SOCKET 在给定 LEVEL 关联的名为 OPTNAME 的选项。选项可能存在于多个协议级别,具体取决于套接字类型,但至少存在于最上层的套接字级别 SOL_SOCKET(在 Socket 模块中定义)。要查询其他级别的选项,应提供控制该选项的相应协议的协议号。例如,要指示选项由 TCP 协议解释,LEVEL 应设置为 TCP 的协议号,可以使用 getprotobyname 获取。

该函数返回一个表示所请求套接字选项的打包字符串,或者在出错时返回 undef,错误原因将放置在 $! 中。打包字符串中包含的内容取决于 LEVEL 和 OPTNAME;有关详细信息,请参阅 getsockopt(2)。常见情况是选项是一个整数,在这种情况下,结果是一个打包的整数,可以使用 unpacki(或 I)格式对其进行解码。

以下是一个测试套接字上是否启用了 Nagle 算法的示例

use Socket qw(:all);

defined(my $tcp = getprotobyname("tcp"))
    or die "Could not determine the protocol number for tcp";
# my $tcp = IPPROTO_TCP; # Alternative
my $packed = getsockopt($socket, $tcp, TCP_NODELAY)
    or die "getsockopt TCP_NODELAY: $!";
my $nodelay = unpack("I", $packed);
print "Nagle's algorithm is turned ",
       $nodelay ? "off\n" : "on\n";

可移植性问题:"getsockopt" in perlport.