我終於設法在我的軟件中修復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