带有perl的IPv6在Windows上不起作用

交叉帖http://perlmonks.org/index.pl?node_id=984750

( perl的Windows IPv6的可能重复)我试着下面的示例: https : //metacpan.org/module/IO :: Socket :: IP

use IO::Socket::IP -register; my $sock = IO::Socket->new( Domain => PF_INET6, LocalHost => "::1", Listen => 1, ) or die "Cannot create socket - $@\n"; print "Created a socket of type " . ref($sock) . "\n"; 

它给出输出为:不能创build套接字 – 没有地址与节点名相关联

我正在使用ActiveState的Perl 5.14.2,并build立了它的IO ::套接字:: IP模块。

以下是ping结果:

 c:\>ping ::1 Pinging ::1 with 32 bytes of data: Reply from ::1: time<1ms Reply from ::1: time<1ms Reply from ::1: time<1ms Reply from ::1: time<1ms Ping statistics for ::1: Packets: Sent = 4, Received = 4, Lost = 0 (0% loss), Approximate round trip times in milli-seconds: Minimum = 0ms, Maximum = 0ms, Average = 0ms 

如果我使用IPv4风格的回送地址127.0.0.1,上面的代码运行良好。 我想知道我缺less什么。

更新:

我刚刚清理了perl安装程序和path,并从http://www.activestate.com/activeperl/downloads新安装了perl 5.14.2

然后我尝试了以下简单的代码:

 use strict; use warnings; use Socket qw(getaddrinfo SOCK_STREAM AI_PASSIVE ); my ( $err, @res ) = getaddrinfo( "::", 8086, { socktype => SOCK_STREAM, flags => AI_PASSIVE, } ); die $err if $err; 

它以如下错误结束:在c:\ IPv6.pl第10行没有与nodename关联的地址。

但是用127.0.0.1它返回适当的值。

我使用的Windows 2008 R2框,在我的另一个窗口框相同的运行也失败。

我试图在Socket.pm中跟踪这个调用,并发现“fake_getaddrinfo”被调用,而不是真正的getaddrinfo。 看来XSLoader无法从Socket.dll中find/加载getaddrinfo,或者Socket.dll根本没有getaddrinfo。 可能是什么原因?

以下使用Socket6的类似代码可以在相同的设置下正常工作:

 use Socket; use Socket6; @res = getaddrinfo('::', 8086, 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"); socket(Socket_Handle, $family, $socktype, $proto) || next; bind(Socket_Handle,$saddr ) || die "bind: $!"; listen(Socket_Handle, 5) || die "listen: $!"; ($host, $port) = getnameinfo($saddr, NI_NUMERICHOST | NI_NUMERICSERV); print ("\nReady for connections \nhost= $host port = $port"); $paddr = accept(Client, Socket_Handle); } 

所以我甚至不能指责设置或系统DLL。 perl的内置IPv6支持windows的“activestate”版本有问题吗?

正如vinsworldcom在perlmonks.org上所述 ,要使用IPv6套接字,您需要安装Socket6模块。 只要你通过cpan安装,代码片段将正常工作。