考虑以下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构造函数或这是预期的行为?如果是后者,有没有办法区分“网络接口不活动”错误和构造函数方法的真正无效参数?
答案 0 :(得分:8)
您看到“无效参数”,因为构造函数尝试解析主机名,收到错误,并在EINVAL
中返回$!
。如果您使用$host
中的IP地址,您会看到真正的错误,“网络无法访问”。
此外,IO::Socket::INET
设置$@
以限定$!
中返回的错误,因此如果您打印$@
以及$!
,您将看到“错误的主机名'google.com'“,这可能是比使用IP地址而不是主机名获得的”网络无法访问“更好的诊断。在这两种情况下,都应该立即清楚发生了什么。