4

考虑下面的 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;
# ...

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

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

4

1 回答 1

8

您看到“无效参数”是因为构造函数尝试解析主机名,收到错误并返回EINVAL. $!如果您在 中使用 IP 地址$host,您会看到真正的错误“网络无法访问”。

此外,IO::Socket::INET设置$@限定返回的错误$!,因此如果您打印$@以及$!,您将看到“错误的主机名 'google.com'”,这可能比使用 IP 地址获得的“网络无法访问”更好的诊断而不是主机名。在这两种情况下,都应该立即清楚发生了什么。

于 2011-05-23T22:13:54.580 回答