3

私は最終的に私のソフトウェアで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マシンで作業しています。

4

2 に答える 2

1

has_ipv6()の関数を信頼しないでくださいParanoid::Network::Socket。Perl がサポートしているかどうかをチェックするだけなので、偽陽性を返しますが、これではまったく不十分です (例として、システムに ipv6 カーネル モジュールがロードされていない可能性があります)。

私は次の関数になりましたが、うまくいくようです。

use IO::Socket::IP;

sub supports_ipv6 {
    my $has_ipv6;

    eval {
        $has_ipv6 = IO::Socket::IP->new (
            Domain => PF_INET6,
            LocalHost => '::1',
            Listen => 1 ) or die;
    };

    if ($@) {
        return 0;
    }
    else {
        return 1;
    }
}
于 2012-09-20T20:07:25.630 に答える
1

AF_INET6次の方法で定数の存在を検出できますeval

use constant HAS_AF_INET6 => defined eval { Socket::AF_INET6() };

しかし、これでは十分ではありません。OSがその定数をサポートしているからといって、この特定のマシンがそれをサポートしているわけではありません。全体socket()bind()操作が同様に機能することをテストする必要があります。そのためには、何らかの方法で実際のオブジェクト コンストラクターをエラー検出する必要があります。

于 2012-09-16T17:50:47.650 に答える