Как получить подстановочный адрес с помощью getaddrinfo
Перекрестная почта на: 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' указание нулевого указателя имени хоста делает работу, для perl, который я пробовал '', undef, но они возвращают адреса обратной связи.
1 ответ
Если это для локальной привязки, вы хотите предоставить 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