我终于设法在我的软件中修复ipv6支持。不幸的是,现在它在每台仅有ipv4的机器上崩溃。下面是错误的子程序:如何检测系统是否支持ipv6?
sub init
{
my ($self, %opts) = @_;
# server options defaults
my %defaults = (StartBackground => 0, ServerPort => 3000);
# set options or use defaults
map { $self->{$_} = (exists $opts{$_} ? $opts{$_} : $defaults{$_}) }
keys %defaults;
$self->{'server'} = HTTP::AppServer::Base->new($self->{'ServerPort'}, Socket::AF_INET6);
return $self;
}
这里的问题是在倒数第二行:
$self->{'server'} = HTTP::AppServer::Base->new($self->{'ServerPort'}, Socket::AF_INET6);
由于在IPv4上只有它死在抱怨一个不支持的地址族(机,这是第二个参数传递给new
函数)。
基本上,我需要做的是:
if (it_supports_ipv6()) {
$self->{'server'} = HTTP::AppServer::Base->new($self->{'ServerPort'}, Socket::AF_INET6);
}
else {
$self->{'server'} = HTTP::AppServer::Base->new($self->{'ServerPort'});
}
但如何实现像it_supports_ipv6()
的功能?
我试着用eval
使用下面的语法,但它不工作:
my $ipv6_success = eval { $self->{'server'} = HTTP::AppServer::Base->new($self->{'ServerPort'}, Socket::AF_INET6); };
if (!defined($ipv6_success)) {
$self->{'server'} = HTTP::AppServer::Base->new($self->{'ServerPort'});
}
的逻辑是,我在eval
文档,它返回undef
读过如果表达式导致程序死。
我正在使用Linux机器。
它会死机还是死?如果它只是在死亡,你可以在['eval'](http://search.cpan.org/perldoc?perlfunc#eval)调用中用'Socket :: AF_INET6'引用包装行。 – mob
'Paraniod :: Network :: Socket'是Socket的包装器,提供BOOL'has_ipv6()' – charlesbridge
@mob,是的,你说得对,它死了!我会检查评估。 – Zagorax