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