Perl主机到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地址,使用具有以下内容的套接字即可:

$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谢谢!我在什么地方看到过,但不确定。编辑成邮报。