Perl Host to Ip Resolution

时间:2017-06-14 00:37:29

标签: perl gethostbyname

我想将一个主机名解析为一个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时,代码仍然停止。

1 个答案:

答案 0 :(得分:3)

gethostbyname的超时非常非常长。我认为你杀了程序才能看到它只需要很长时间。您似乎确实需要更短的超时时间。

您可以使用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内,所以它被捕获并且控制在块之后向右移动。我们测试die是否确实是由于我们的警报,如果不是我们重新提升它。

另请参阅this post以获取更多评论,请搜索更多内容。

模块Timeout中存在的IO::Socket功能用于连接,而不是DNS查找,这是罪魁祸首。感谢Steffen Ullrich发表评论。