2012-07-05 33 views
3

我有一個使用TCP/IP套接字的Perl/Windows應用程序,我需要添加IPv6支持。perl windows IPv6

我有一臺Windows 7 64位機器,它運行的是IPv6颶風電動隧道,它在http://test-ipv6.com/上得分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

您的原始問題存在很多問題。你定義'$提示',但不要在任何地方使用它。您將它初始化爲一個鍵/值列表,即使它是一個標量。您似乎沒有使用'strict',因爲這些變量都沒有聲明。你可以編輯代碼,或重新問一些實際的敏感代碼? – LeoNerd 2012-07-08 14:20:50

回答

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位,因爲相同的代碼適用於我。

+0

謝謝。是的,我可以在這裏ping loopofzen.co.uk。這很可能是Windows Perl構建的ActiveState(和Strawberry Perl)所存在的問題。 – user521619 2012-07-05 16:43:04

0

因此,我將Linux(Ubuntu)的副本放到舊筆記本電腦上,並且相同的代碼工作得很好。

似乎IPv6支持存在但在Windows上的ActivePerl和Strawberry Perl中損壞。

有人建議用於製作Windows版本的編譯器頭文件和庫尚未針對IPv6進行更新。希望這將在適當的時候得到解決。同時,我可以在Linux上繼續開發。

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」適合我。