私は最終的に私のソフトウェアで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;
}
ここでの問題は、最後の 2 行目にあります。
$self->{'server'} = HTTP::AppServer::Base->new($self->{'ServerPort'}, Socket::AF_INET6);
ipv4 のみのマシンと同様に、サポートされていないアドレス ファミリ (関数に渡される 2 番目のパラメーター) について不平を言って停止し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マシンで作業しています。