交叉发布所有Windows的Perl http://perlmonks.org/index.pl?node_id=984750的IPv6上没有工作
(的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 - [email protected]\n";
print "Created a socket of type " . ref($sock) . "\n";
这是给输出: 无法创建套接字 - 没有与节点名相关的地址
我使用ActiveState perl 5.14.2并在其上构建了IO :: Socket :: IP模块。
以下是平的结果:
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,上面的代码效果很好。 我想知道我错过了什么。
更新:
我刚擦洗从 http://www.activestate.com/activeperl/downloads
perl的设置和路径,新安装的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行的节点名称关联。
但是用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支持有问题吗?
该代码段在Linux上完美工作,因此这可能是一个平台bug – anttix 2012-08-01 06:28:33
我怀疑上面的代码没有初始化一个ipv6套接字地址结构,并且scope_id和flowspec字段设置正确。在C代码中,绑定到:: 1的典型方法是调用getifaddrs()并枚举具有:: 1作为IP或“lo”作为适配器名称的适配器。然后使用ifaddrs-> ifa_addr作为绑定的套接字地址。我不知道perl是否有办法做到这一点。 – selbie 2012-08-01 08:01:48
您是否允许通过Windows防火墙使用此套接字? – 2012-08-01 11:33:06