如何使用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,但它们返回环回地址。

如果是本地绑定,则需要提供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=$portn";
}

这将打印

$ 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-套接字IP

最新更新