交叉发帖:http://www.perlmonks.org/?node_id=988678
我是perl的新手。我试图使用getaddrinfo获取所有通配符接口(我正在使用Socket6(IO:套接字: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但它们返回环回地址。
答案 0 :(得分: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
的作者,我很想知道它为什么不适合你 - 也许你可以把它作为一个bug来提升? https://rt.cpan.org/Dist/Display.html?Queue=IO-Socket-IP