我终于设法在我的软件中修复了对 ipv6 的支持。不幸的是,现在它在每台仅 ipv4 的机器上崩溃。这是错误的子程序:
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
doc 中读到,undef
如果表达式导致程序死亡,它会返回。
我正在使用 Linux 机器。