IO::Socket::INET->new 是否在出错时返回未定义?



>我有以下代码(较大脚本的一部分(

my $lsn = IO::Socket::INET->new(Listen => 1, LocalPort => 0); # just use any available port.
$port = $lsn->sockport();

我收到错误Can't call method "sockport" on an undefined value.

IO::Socket::INET的文档在这个问题上没有说太多:https://perldoc.perl.org/IO/Socket/INET.html(有没有更好的地方可以看?不太熟悉这个模块(。

奇怪的是,我最近在传入一个非零的随机生成的端口号之前更改了它,并且在使用端口时有时会中断。

我在本地 Windows 机器上测试了传入0(同样,文档似乎没有提到如何让它选择要绑定的端口(,这似乎使它"选择任何可用的端口",这是我想要的,但也许它在 Solaris 上的行为不同(这是发生此问题的地方(?

IO::Socket::INET->new的工作方式与大多数Perl构造函数类似:它在成功时返回类的实例,在错误时返回一个假值。有一些侧通道可以获取错误原因。确切地说,这个虚假值被故意不记录下来,重要的是它是假的。

这导致了一般模式my $obj = Class->new or die $reason;。在IO::Socket的情况下,你会从$@得到错误(这是非常严重的(。

my $port = 999;
my $lsn = IO::Socket::INET->new(Listen => 1, LocalPort => $port)
or die "Couldn't listen on port $port: $@";
# Couldnt listen on port 999: Permission denied at -e line 1.

我测试了在本地 Windows 机器上传入 0(同样,文档似乎没有提到如何让它选择要绑定的端口(,这似乎使它"选择任何可用的端口",这就是我想要的,但也许它在 Solaris 上的行为不同(这是发生此问题的地方(?

是的,这是特定于实现的。IO::Socket::INET 只是使用bind的套接字库周围的一层薄薄的层。如果您传递bind端口 0,它将为您找到一个端口。这通常适用于所有现代实现。

视窗bind...

对于 TCP/IP,如果端口指定为零,则服务提供商将从动态客户端端口范围为应用程序分配一个唯一的端口。在 Windows Vista 及更高版本上,动态客户端端口范围是介于 49152 和 65535 之间的值。这是与 Windows Server 2003 及更早版本相比的更改,其中动态客户端端口范围的值介于 1025 和 5000 之间。

它是否试图绑定到特权端口(在 Solaris 上小于 1024(? 如果是这样,则可能是权限问题,需要root访问权限才能绑定。

最新更新