从inet_pton解压缩IPv6地址

时间:2017-08-16 21:33:15

标签: perl

多年来,我一直使用以下功能作为我的许多IP计算代码的基础。它们只需要内置的perl模块Socket,因此它们非常便携。

sub ip2int { return( unpack("N",inet_aton(shift)) ) };
sub int2ip { return( inet_ntoa(pack("N",shift)) ) };

使用Socket6尝试相同的操作似乎不起作用:

尝试1:

$ perl -MSocket6 -e '$x = inet_pton(AF_INET6,"2000::1"); print unpack("q",$x) . "\n"'
32

尝试2:

$ perl -MSocket6 -e '$x = inet_pton(AF_INET6,"2000::1"); print 
unpack("Q",$x) . "\n"'
32

尝试3:

$ perl -MSocket6 -e '$x = inet_pton(AF_INET6,"2000::1"); print unpack("N",$x) . "\n"'
536870912

我无法弄清楚如何获取地址的整数值,因此我可以使用算术进行网络相关的计算。有人有什么想法吗?

1 个答案:

答案 0 :(得分:3)

IPv6地址大小为128位。

$ perl -e'
   use feature qw( say );
   use Socket6 qw( inet_pton AF_INET6 );
   say 8*length(inet_pton(AF_INET6, "2000::1"));
'
128

你不太可能拥有支持128位整数的Perl。您可以获得Math::Int128

的帮助
$ perl -e'
   use feature qw( say );
   use Socket6      qw( inet_pton AF_INET6 );
   use Math::Int128 qw( net_to_uint128 );
   say net_to_uint128(inet_pton(AF_INET6, "2000::1"));
'
42535295865117307932921825928971026433