Perl IO::Socket::INET 令人困惑的“无效参数”错误

发布于 2024-11-09 02:01:29 字数 421 浏览 0 评论 0原文

考虑以下 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 构造函数,或者这是预期的行为?如果是后者,有没有办法区分“网络接口不活动”错误和构造函数方法的真正无效参数?

Consider the following snippet of a Perl script:

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

Everything works as expected under normal conditions but when then host system's internet connection is inactive the "sock" variable is empty and $! has the message "Invalid argument".

Am I using the INET constructor inappropriately or is this the expected behavior? If the latter, is there a way to differentiate between a "network interface inactive" error and a genuine invalid argument to the constructor method?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

傲鸠 2024-11-16 02:01:29

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

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

You are seeing "Invalid argument" because the constructor tries to resolve the hostname, gets an error, and returns EINVAL in $!. If you would use an IP address in $host, you would see the real error, "Network is unreachable".

Also, IO::Socket::INET sets $@ to qualify the error returned in $!, so if you print $@ as well as $!, you will see "Bad hostname 'google.com'", which is probably an even better diagnostic than "Network unreachable" you would get with an IP address instead of the hostname. In both cases it should be immediately clear what is going on.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文