我想将主机名解析为 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(使用前将#替换为@)