3

クロスポストhttp://perlmonks.org/index.pl?node_id=984750

( perl windows IPv6の重複の可能性あり) https://metacpan.org/module/IO::Socket::IPから次のサンプル例を試しました

use IO::Socket::IP -register;

my $sock = IO::Socket->new(
   Domain    => PF_INET6,
   LocalHost => "::1",
   Listen    => 1,
) or die "Cannot create socket - $@\n";

print "Created a socket of type " . ref($sock) . "\n";

次のように出力されます:ソケットを作成できません - ノード名に関連付けられたアドレスがありません

私は ActiveState perl 5.14.2 を使用しており、IO::Socket::IP モジュールを構築しています。

ping の結果は次のとおりです。

c:\>ping ::1

Pinging ::1 with 32 bytes of data:
Reply from ::1: time<1ms
Reply from ::1: time<1ms
Reply from ::1: time<1ms
Reply from ::1: time<1ms

Ping statistics for ::1:
    Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
    Minimum = 0ms, Maximum = 0ms, Average = 0ms

IPv4 スタイルのループバック アドレス 127.0.0.1 を使用すると、上記のコードはうまく機能します。私は何が欠けているのだろうかと思っています。

アップデート:

perl のセットアップとパスをクリーンアップし、 http: //www.activestate.com/activeperl/downloads から perl 5.14.2 を新たにインストールしました。

そして、次の簡単なコードを試しました:

use strict;
use warnings;

use Socket qw(getaddrinfo SOCK_STREAM AI_PASSIVE  );

my ( $err, @res ) = getaddrinfo( "::", 8086, {
    socktype => SOCK_STREAM,
    flags => AI_PASSIVE,
} );
die $err if $err;

次のエラーで終了しました: c:\IPv6.pl 行 10 のノード名に関連付けられたアドレスがありません。

しかし、127.0.0.1 では適切な値が返されます。

Windows 2008 R2 ボックスを使用していますが、別の Windows ボックスで同じ実行をしても失敗します。

Socket.pm でこの呼び出しを追跡しようとしたところ、実際の getaddrinfo ではなく「fake_getaddrinfo」が呼び出されていることがわかりました。XSLoader が Socket.dll から getaddrinfo を見つけてロードできなかったか、Socket.dll に getaddrinfo がまったくなかったようです。その理由は何ですか?

Socket6 を使用した以下の同様のコードは、同じセットアップで適切に機能します。

use Socket;
use Socket6;

@res = getaddrinfo('::', 8086, AF_UNSPEC, SOCK_STREAM);

while(scalar(@res)>=5){

    ($family, $socktype, $proto, $saddr, $canonname, @res) = @res;
    ($host, $port) = getnameinfo($saddr, NI_NUMERICHOST | NI_NUMERICSERV);
    print ("\nhost= $host port = $port");
    socket(Socket_Handle, $family, $socktype, $proto) || next;
    bind(Socket_Handle,$saddr  )  || die "bind: $!";
    listen(Socket_Handle, 5) || die "listen: $!";

    ($host, $port) = getnameinfo($saddr, NI_NUMERICHOST | NI_NUMERICSERV);
    print ("\nReady for connections \nhost= $host port = $port");
    $paddr = accept(Client, Socket_Handle);
}

したがって、セットアップやシステム dll のせいにすることさえできません。Windows のアクティブステート ビルドに対する perl の組み込み IPv6 サポートに問題はありますか?

4

1 に答える 1