给定Perl中的IP地址和子网掩码,如何创建有效的IP范围?

时间:2009-11-15 19:56:19

标签: perl ip-address

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

4 个答案:

答案 0 :(得分:3)

有关按位运算符的信息,请参阅perldoc perlop(它们与大多数其他类C语言相同):

  • &是按位AND
  • |是按位OR
  • ^是按位XOR
  • >>是右移
  • <<左移

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

答案 1 :(得分: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;

使用Net :: Netmask更容易理解:

#!/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;

答案 2 :(得分:0)

快速&amp;找到子网掩码的脏方法:

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

答案 3 :(得分:0)

以下代码段可以帮助您在rhel7上找到IP地址和子网掩码

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