2009-11-15 97 views
3

如何在Perl中给定IP地址和子网掩码的情况下创建有效的IP范围?我理解生成IP范围的概念,但需要帮助用Perl编写。例如,如果我与IP地址和子网掩码相同,我会得到子网号码。给这个数字加1应该给我第一个有效的IP。如果我将子网掩码和子网号码反转,我应该得到广播地址。从它减去1应该给最后一个有效的IP地址。如何在Perl中给定IP地址和子网掩码来创建有效的IP范围?

+0

你只是要求Perl的按位操作,还是一个例子? – Baxter 2009-11-15 20:00:00

+0

我正在寻找一个例子(我认为Perl的按位操作将用于创建示例) – user211491 2009-11-15 20:04:09

回答

3

perldoc perlop有关位运算符的信息(它们是相同的,因为在大多数其他类似C语言):

  • &是位与
  • |是位或
  • ^是按位XOR
  • >>是右移
  • <<是左实英尺

但是,如果你真的想做一些网络块和IP地址的工作(而不是简单地回答家庭作业 - 尽管我很好奇你会用Perl做什么课程),但是,你能避免转向CPAN重新发明轮子:

0

快速&肮脏的方式寻子网米问:

use Socket; 
my $subnet_mask = inet_ntoa(inet_aton($ip_str) & inet_aton($mask_str)): 
+0

我认为你打算从那里得到客户端地址和网络掩码的网络地址,但写的代码是错误。 – hobbs 2009-11-16 07:32:41

+0

此代码获取您的子网的基本IP地址。加1以获得第一个有效的IP地址。 – IggShaman 2009-11-16 18:18:09

3

如果你想与位运算符自己玩,就变成这样:

#!/usr/bin/perl 
use strict; 
use warnings; 
use Socket; 

my $ip_address = '192.168.0.15'; 
my $netmask = 28; 

my $ip_address_binary = inet_aton($ip_address); 
my $netmask_binary = ~pack("N", (2**(32-$netmask))-1); 

my $network_address = inet_ntoa($ip_address_binary & $netmask_binary); 
my $first_valid  = inet_ntoa(pack('N', unpack('N', $ip_address_binary & $netmask_binary) + 1)); 
my $last_valid   = inet_ntoa(pack('N', unpack('N', $ip_address_binary | ~$netmask_binary) - 1)); 
my $broadcast_address = inet_ntoa($ip_address_binary | ~$netmask_binary); 

print $network_address, "\n"; 
print $first_valid, "\n"; 
print $last_valid, "\n"; 
print $broadcast_address, "\n"; 

exit; 

配网::子网掩码它更容易理解:

#!/usr/bin/perl 
use strict; 
use warnings; 
use Net::Netmask; 

my $ip_address = '192.168.0.15'; 
my $netmask = 28; 

my $block = Net::Netmask->new("$ip_address/$netmask"); 

my $network_address = $block->base(); 
my $first_valid  = $block->nth(1); 
my $last_valid   = $block->nth($block->size - 2); 
my $broadcast_address = $block->broadcast(); 

print $network_address, "\n"; 
print $first_valid, "\n"; 
print $last_valid, "\n"; 
print $broadcast_address, "\n"; 

exit; 
0

下面的代码片段可以帮助你找到rhel7上的ip地址和子网掩码

my $ip=`hostname -i`; 
my $subnet = `ip addr show|grep -i ".*${ip}/.*"|tail -1|cut -d "/" -f2|cut -d " " -f1`;