【问题标题】:Perl IO::Socket::INET confusing "Invalid argument" errorPerl IO::Socket::INET 混淆“无效参数”错误
【发布时间】:2011-05-24 06:20:58
【问题描述】:

考虑以下 Perl 脚本的 sn-p:

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;
# ...

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

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

【问题讨论】:

  • @ikegami:不幸的是,Mac OS 10.6.7 上的 Perl 5.8.9 和 Linux 2.6.35(Ubuntu 10.10)上的 Perl 5.10.1 都没有 $^E$! 不同的错误.
  • 那么抱歉,这就是系统提供的所有信息。或者可能某处缺少错误检查,而真正的错误正在被无用的错误覆盖。

标签: perl sockets invalid-argument inet


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-03
    • 2012-03-08
    • 2018-11-24
    • 2018-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多