在Windows上使用perl的IPv6无法正常工作

时间:2012-08-01 06:20:37

标签: windows perl ipv6

交叉发布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";

输出为: 无法创建套接字 - 没有与节点名称相关联的地址

我正在使用ActiveState perl 5.14.2,并在其上构建了IO :: Socket :: 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,则上述代码效果很好。 我想知道我错过了什么。

更新

我刚刚清理了perl设置和路径,并从中新安装了perl 5.14.2 http://www.activestate.com/activeperl/downloads

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

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行没有与节点名相关联的地址。

但是使用127.0.0.1它会返回正确的值。

我正在使用Windows 2008 R2框,同样在我的另一个Windows框上运行也失败了。

我只是尝试在Socket.pm中跟踪此调用,并发现调用了“fake_getaddrinfo”而不是真正的getaddrinfo。似乎XSLoader无法从Socket.dll中找到/加载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对windows的activestate构建的内置IPv6支持是否存在问题?

1 个答案:

答案 0 :(得分:0)

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