为什么Net :: IP中的网络掩码设置错误?

时间:2011-10-03 12:35:19

标签: perl net-library

我正在尝试使用一个小脚本来识别查询中的SNMP数据,以将其存储在数据库中。但是在使用Net::IP CPAN模块处理数据时我陷入困境。如果我定义网络字符串没有问题,但我在单独的字符串中有IP和掩码,无论我如何加入它们,模块总是将网络掩码设置为/32

我试过这样:

my $net = "${$query_snmp->{$tablekey}}{'ipRouteMask'}/${$query_snmp->{$tablekey}}{'ipRouteDest'}";
my $IP = new Net::IP ($net) or die (Net::IP::Error());

但无论我将网络掩码设置为什么,所有IP对象始终都使用/32创建。如果我定义一个像192.168.0.0/20这样的字符串或同一个字符串上的任何字符串,我发现没问题。

我错过了什么?

Network -> 192.168.65.64/255.255.255.248

IP  : 192.168.65.64
LASTIP  : 192.168.65.64
Sho : 192.168.65.64
Bin : 11000000101010000100000101000000
Int : 3232252224
*** Mask: 255.255.255.255 *** wtf ??
Last: 192.168.65.64
Len : 32
Size: 1
Type: PRIVATE
Rev:  64.65.168.192.in-addr.arpa.

2 个答案:

答案 0 :(得分:4)

来自manual:可以从单个IP地址或无类别前缀创建Net :: IP对象,...

我认为您已选择指定无类网络,前提是您插入了有效的网络说明符,它适用于我。

#!/usr/bin/perl -w    
use Net::IP;
my $ip = new Net::IP('112.198.64.0/18') or die (Net::IP::Error());
print ("IP  : ".$ip->ip()."\n");
print ("Sho : ".$ip->short()."\n");
print ("Bin : ".$ip->binip()."\n");
print ("Int : ".$ip->intip()."\n");
print ("Mask: ".$ip->mask()."\n");
print ("Last: ".$ip->last_ip()."\n");
print ("Len : ".$ip->prefixlen()."\n");
print ("Size: ".$ip->size()."\n");
print ("Type: ".$ip->iptype()."\n");
print ("Rev:  ".$ip->reverse_ip()."\n");

将输出:

IP  : 112.198.64.0
Sho : 112.198.64
Bin : 01110000110001100100000000000000
Int : 1892040704
Mask: 255.255.192.0
Last: 112.198.127.255
Len : 18
Size: 16384
Type: PUBLIC
Rev:  64.198.112.in-addr.arpa.

但是,如果您输入了“192.168.65.64/255.255.255.248”,这不是Net :: IP接受的格式,您可以使用“192.68.65.64/29”,参见{{3 }}。在这种情况下,它将正常工作:

IP  : 192.168.65.64
Sho : 192.168.65.64
Bin : 11000000101010000100000101000000
Int : 3232252224
Mask: 255.255.255.248
Last: 192.168.65.71
Len : 29
Size: 8
Type: PRIVATE
Rev:  64.65.168.192.in-addr.arpa.

当您使用带有完整网络掩码的格式时,由于它无法识别,它只获得IP并将为您提供255.255.255.255的网络掩码

答案 1 :(得分:0)

谢谢你!我最后使用了一个类似的模块,它不需要将ip掩码转换为dec符号。

Net :: Netmask - > https://metacpan.org/pod/Net::Netmask

构建

Net::Netmask objects are created with an IP address and optionally a mask. There are     many forms that are recognized:

'216.240.32.0/24' The preferred form.

'216.240.32.0:255.255.255.0'
'216.240.32.0-255.255.255.0'
'216.240.32.0', '255.255.255.0'
'216.240.32.0', '0xffffff00'
'216.240.32.0 - 216.240.32.255'
'216.240.32.4'
A /32 block.

'216.240.32'
Always a /24 block.

'216.240'
Always a /16 block.

'140'
Always a /8 block.

'216.240.32/24'
'216.240/16'
'default' or 'any'
0.0.0.0/0 (the default route)
'216.240.32.0#0.0.31.255'

谢谢。