首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在给定Perl的IP地址和子网掩码的情况下创建有效的IP范围?

如何在给定Perl的IP地址和子网掩码的情况下创建有效的IP范围?
EN

Stack Overflow用户
提问于 2009-11-16 03:56:19
回答 4查看 8.5K关注 0票数 3

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

EN

回答 4

Stack Overflow用户

发布于 2009-11-16 04:35:35

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

  • &是按位的AND
  • |是按位的OR
  • ^是按位的XOR
  • >>是right-shift
  • <<是左移

但是,如果您真的想使用网络块和IP地址做一些工作(而不是简单地回答家庭作业-尽管我很好奇您使用Perl会采取什么方法),您可以转向CPAN来避免重复发明轮子:

  • Net::Netmask
  • Network::IPv4Addr
票数 3
EN

Stack Overflow用户

发布于 2009-11-16 17:30:11

如果你想自己使用按位运算符,它会变成这样:

代码语言:javascript
复制
#!/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更容易理解:

代码语言:javascript
复制
#!/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;
票数 3
EN

Stack Overflow用户

发布于 2009-11-16 04:49:33

快速查找子网掩码的方法(&W):

代码语言:javascript
复制
use Socket;
my $subnet_mask = inet_ntoa(inet_aton($ip_str) & inet_aton($mask_str)):
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1738615

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档