Perl 主机到 IP 解析

2023-12-12

我想将主机名解析为 IP 地址,使用以下 Socket 就可以了:

$ip = gethostbyname($host) or die "Can't resolve ip for $host.\n";
$ip = inet_ntoa(inet_aton($host));

这工作正常,直到它遇到不再解析为 IP 的主机名并且代码停止。如何让我的脚本继续处理要解析的主机名的其余 ip。 理想情况下我会简单地设置$ip变量等于"".

即使没有 die 命令,我也尝试过,当代码无法将名称解析为 ip 时,代码仍然会停止。


The timeout on gethostbyname is very, very long. I assume that you kill the program before you can see that it is just taking a long time. It seems that you really need a shorter timeout.

您可以使用设置自己的计时器alarm。当它关闭时,SIGALRM 信号会传递到进程,默认情况下会终止该进程。所以我们为该信号设置了一个处理程序,其中die被发出,从而将其变成异常。这是eval-ed,我们就拿回了控制权。

eval {
    local $SIG{ALRM} = sub { die "Timed out" };

    alarm 5;  # or what you find most suitable

    # your code that may need a timeout

    alarm 0;
};
if ($@ and $@ !~ /Timed out/) { die }  # re-raise if it was something else

if ($@ and $@ =~ /Timed out/) {  # test
    print "We timed out\n";
}

如果您的代码在不到5我们到达的秒数alarm 0;这会取消先前的警报并且程序继续。否则SIGALRM被发射,但被处理并制成die这是eval-ed,因此信号被捕获并且控制权下降到块之后的右侧。我们测试是否die确实是由于我们的警报引起的,如果不是,我们会重新发出警报。

另请参阅这个帖子更多评论,请搜索更多。


  The Timeout functionality that exists in the module IO::Socket is for connect and not for the DNS lookup, which is the culprit here. Thanks to Steffen Ullrich for a comment.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Perl 主机到 IP 解析 的相关文章

随机推荐