2009-11-15 54 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`; 
相關問題