2012-08-01 63 views
3

交叉發佈所有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支持有問題嗎?

+1

該代碼段在Linux上完美工作,因此這可能是一個平臺bug – anttix 2012-08-01 06:28:33

+1

我懷疑上面的代碼沒有初始化一個ipv6套接字地址結構,並且scope_id和flowspec字段設置正確。在C代碼中,綁定到:: 1的典型方法是調用getifaddrs()並枚舉具有:: 1作爲IP或「lo」作爲適配器名稱的適配器。然後使用ifaddrs-> ifa_addr作爲綁定的套接字地址。我不知道perl是否有辦法做到這一點。 – selbie 2012-08-01 08:01:48

+1

您是否允許通過Windows防火牆使用此套接字? – 2012-08-01 11:33:06

回答