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");
}

我想知道我应该为 placeholder 使用什么值,以便在结果中获得 IPv4 和 IPv6 通配符地址(0.0.0.0 和 ::),这样我就可以独立于我正在使用的机器绑定到它(IPv4 或 IPv6)。在 'c' 中指定一个空主机名指针可以完成这项工作,对于 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 回答