如何在给定Perl的IP地址和子网掩码的情况下创建有效的IP范围?我理解生成IP范围的概念,但在编写Perl时需要帮助。例如,如果I与IP地址和子网掩码相加,则得到子网编号。这个数字加上1应该会得到第一个有效的IP。如果我将子网掩码与子网编号进行“或”运算,我应该会得到广播地址。从它中减去1应该得到最后一个有效的IP地址。
发布于 2009-11-16 04:35:35
有关位运算符的信息,请参见perldoc perlop (它们与大多数其他类C语言中的位运算符相同):
&是按位的AND|是按位的OR^是按位的XOR>>是right-shift<<是左移但是,如果您真的想使用网络块和IP地址做一些工作(而不是简单地回答家庭作业-尽管我很好奇您使用Perl会采取什么方法),您可以转向CPAN来避免重复发明轮子:
发布于 2009-11-16 17:30:11
如果你想自己使用按位运算符,它会变成这样:
#!/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;发布于 2009-11-16 04:49:33
快速查找子网掩码的方法(&W):
use Socket;
my $subnet_mask = inet_ntoa(inet_aton($ip_str) & inet_aton($mask_str)):https://stackoverflow.com/questions/1738615
复制相似问题