Perl主机到Ip解析
我想将主机名解析为ip地址,使用具有以下内容的套接字即可:Perl主机到Ip解析,perl,gethostbyname,Perl,Gethostbyname,我想将主机名解析为ip地址,使用具有以下内容的套接字即可: $ip = gethostbyname($host) or die "Can't resolve ip for $host.\n"; $ip = inet_ntoa(inet_aton($host)); 这可以正常工作,直到找到不再解析为IP的主机名,代码停止。如何让脚本继续处理要解析的其余ip主机名。 理想情况下,我只需将$ip变量设置为等于” 即使没有die命令,我也尝试过,当无法将名称解析为ip时,代码仍然会停止。gethost
$ip = gethostbyname($host) or die "Can't resolve ip for $host.\n";
$ip = inet_ntoa(inet_aton($host));
这可以正常工作,直到找到不再解析为IP的主机名,代码停止。如何让脚本继续处理要解析的其余ip主机名。
理想情况下,我只需将$ip
变量设置为等于”
即使没有die命令,我也尝试过,当无法将名称解析为ip时,代码仍然会停止。gethostbyname上的超时时间非常长。我假设你在看到这个程序花了很长时间之前就把它杀掉了。看来您真的需要更短的超时时间。† 您可以使用设置自己的计时器。当它关闭时,会向进程发送一个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秒内完成,我们将进入报警0代码>取消上一个报警,程序继续。否则会发出SIGALRM
,但会被处理并制作成die
,该die是eval
-ed,因此信号会被捕获,控制会下降到块后的右侧。我们测试die
是否确实是由于我们的警报引起的,如果不是,我们将重新引发警报
另请参阅以获取更多评论,并请搜索更多
†模块IO::Socket
中存在的Timeout
功能用于连接,而不是DNS查找,这是罪魁祸首。感谢您的评论。gethostbyname上的超时时间非常长。我假设你在看到这个程序花了很长时间之前就把它杀掉了。看来您真的需要更短的超时时间。†
您可以使用设置自己的计时器。当它关闭时,会向进程发送一个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秒内完成,我们将进入报警0代码>取消上一个报警,程序继续。否则会发出SIGALRM
,但会被处理并制作成die
,该die是eval
-ed,因此信号会被捕获,控制会下降到块后的右侧。我们测试die
是否确实是由于我们的警报引起的,如果不是,我们将重新引发警报
另请参阅以获取更多评论,并请搜索更多
†模块IO::Socket
中存在的Timeout
功能用于连接,而不是DNS查找,这是罪魁祸首。感谢您的评论。使用eval
尝试使用eval
IO::Socket::::*中的超时仅用于套接字活动,即连接。它不包括使用gethostbyname或gethostbyaddr阻止的DNS查找。@SteffenUllrich谢谢!我在什么地方看到过,但不确定。编辑到post。IO::Socket::*中的超时仅用于套接字活动,即连接。它不包括使用gethostbyname或gethostbyaddr阻止的DNS查找。@SteffenUllrich谢谢!我在什么地方看到过,但不确定。编辑成邮报。