3

クロスポスト:http ://www.perlmonks.org/?node_id = 988678

私はperlを初めて使用します。getaddrinfoを使用してすべてのワイルドカードインターフェイスをフェッチしようとしています(Socket6を使用しています(IO:Socket:IPがWindowsボックスで機能しませんでした))。

use Socket;
use Socket6;

@res = getaddrinfo('<wildcard>', 3786, 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");
}

プレースホルダーにどの値を使用すればよいのでしょうか。結果としてIPv4とIPv6ワイルドカードアドレス(0.0.0.0および::)を取得して、使用しているマシンに関係なくバインドできるようにします。 (IPv4またはIPv6)。'c'では、nullホスト名ポインタを指定すると機能します。perlの場合は''、undefを試しましたが、ループバックアドレスが返されます。

4

1 に答える 1

2

ローカル バインドの場合は、AI_PASSIVEヒントを提供する必要があります。

use strict;
use warnings;

use Socket qw( :addrinfo SOCK_STREAM );

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

for my $res ( @res ) {
  my ( $err, $addr, $port ) = getnameinfo( $res->{addr}, NI_NUMERICHOST|NI_NUMERICSERV );
  die $err if $err;
  print "Addr=$addr port=$port\n";
}

これは印刷します

$ perl gai.pl
Addr=0.0.0.0 port=3786
Addr=:: port=3786

また、の作者として、IO::Socket::IPなぜそれがうまくいかなかったのかを知りたいと思っています - おそらくバグとして提起することができますか? https://rt.cpan.org/Dist/Display.html?Queue=IO-Socket-IP

于 2012-08-21T11:10:45.873 に答える