我有一个使用TCP / IP套接字的Perl / Windows应用程序,我需要添加IPv6支持。
我有一台运行带有Hurricane Electric隧道的IPv6的Windows 7 64位计算机,它在http://test-ipv6.com/上获得10分10,并且将访问仅限IPv6的网站,例如http://loopsofzen.co.uk/。
它有ActivePerl 5.14.2(我也尝试过Strawberry Perl 5.16.0.1)。
这是一个简单的测试脚本:
use Socket qw( getaddrinfo );
$host = 'loopsofzen.co.uk';
$port = 80;
$hints = (socktype => SOCK_STREAM, family -> Socket::AF_INET6);
($err, @addrs) = getaddrinfo($host, 0);
die $err if $err;
,这会产生错误:
no address associated with nodename at ip.pl line 6.
(新)getaddrinfo()
函数似乎可用,如果我将$host
设置为使用IPv4主机名,它确实有效。但IPv6似乎根本不起作用。
我错过了什么?或Perl / Windows / IPv6目前仍然是一个失败的原因?
答案 0 :(得分:0)
OSX上的以下“适用于我”,可以成功ping -6 loopsofzen.co.uk
。
$ perl -lE'use Socket qw( getaddrinfo );
($err, @addrs) = getaddrinfo(q{loopsofzen.co.uk}, 0);
die $err if $err; print map { "@{[ %$_ ]}" } @addrs;'
protocol 17 canonname addr ?? socktype 2 family 30protocol 6 canonname addr ?? socktype 1 family 30
我认为你的问题不是Perl位,因为相同的代码适用于我。
答案 1 :(得分:0)
所以我把Linux(Ubuntu)的副本扔到一台旧笔记本电脑上,同样的代码工作正常。
似乎存在IPv6支持,但在Windows上的ActivePerl和Strawberry Perl中已经破坏了。
有人建议用于制作Windows版本的编译器头文件和库尚未针对IPv6进行更新。希望这将在适当的时候得到解决。与此同时,我可以在Linux上继续开发。
答案 2 :(得分:0)
您可以在Windows上从源代码编译自己的Perl 5.16。
我是使用VC10(Microsoft Visual Studio 2010)使用“Visual Studio x64 Win64命令提示符(2010)”完成的。它基本上是常规的命令提示符,但是为x64版本准备了所有环境。
我认为Visual Studio有一些“快速”免费版本,但我不知道那些与商业版本相比缺乏什么。
我在构建Perl时遇到了麻烦,只需阅读README和INSTALL文件即可。我实际上对Apache 2.2,mod_perl以及我从CPAN使用/需要的所有模块做了同样的事情。如果从同一VS命令提示符运行cpan和cpanm之类的东西,只要模块与Win32兼容(95%的模块兼容),一切都会很好。
“getaddrinfo”功能对我来说非常适合。