Perl IO :: Socket :: INET混淆"无效参数"错误

mae*_*ics 4 sockets perl invalid-argument inet

考虑以下Perl脚本片段:

use IO::Socket;
# ...
my $sock = IO::Socket::INET->new(
    PeerAddr => $host, # e.g. "google.com"
    PeerPort => $port, # e.g. 80
    Proto => 'tcp'
);
die("no socket: $!") unless $sock;
# ...
Run Code Online (Sandbox Code Playgroud)

在正常情况下,一切都按预期工作,但是当主机系统的互联网连接处于非活动状态时,"sock"变量为空并且$!显示消息"无效参数".

我不恰当地使用INET构造函数还是预期的行为?如果是后者,有没有办法区分"网络接口不活动"错误和构造函数方法的真正无效参数?

Grr*_*rrr 8

因为构造函数尝试解析主机名,得到一个错误,并返回所看到的"无效参数" EINVAL$!.如果你要使用IP地址$host,你会看到真正的错误,"网络无法访问".

此外,IO::Socket::INET$@有资格的错误恢复$!,因此,如果您打印$@,以及$!,你会看到"主机名错误'google.com’",这可能是比一个更好的诊断"网络不可达",你会得到一个IP地址而不是主机名.在这两种情况下,应该立即清楚发生了什么.