| [reply] |
sub range_from_net {
my ($subnet,$mask)=@_;
my $subbits=addr2bits($subnet);
my $maskbits=addr2bits($mask);
my $allones = ~ $maskbits;
my $top = $allones - 1;
my $bottom = ($subbits + 1) & $allones;
return ($bottom,$top);
}
sub addr2bits {
my $ip=shift;
my @o=split([\.],$ip);
return ( ($o[0] << 24 ) + ($o[1] << 16) + ($o[2]<<8) + $o[3]);
}
sub bits2addr {
my $bits=shift;
return sprintf("%d.%d.%d.%d",
(($bits & 0xff000000 ) >> 24),
(($bits & 0x00ff0000 ) >> 16),
(($bits & 0x0000ff00 ) >> 8),
($bits & 0x000000ff ) );
}
There may be a few bugs in the above code as I did not
test it, but there is the basic overall algorithm I have
used when I have had to solve the problem.
Peter L. Berghold -- Unix Professional Peter at Berghold dot Net |
| |
Dog trainer, dog agility exhibitor, brewer of
fine Belgian style ales. Happiness is a warm, tired, contented dog curled up at your side and
a good Belgian ale in your chalice. |
| [reply] [d/l] |
Net::Netmask handles this nicely, but only for IPv4.
--Bob Niederman, http://bob-n.comAll code given here is UNTESTED unless otherwise stated.
| [reply] |
Yet another way (my preference) is to use
NetAddr-IP-3.14.
I would recommend this because it is fully featured,and easy to use, with plenty of examples.
Update: It seems that the link above does not point to the right module, and neither does the one below from jdtoronto. Links into CPAN don't seem to work right today, so,
Please search CPAN for
NetAddr::IP to get the module I refer to.
Update II: Thanks, phydeauxarff - here is the correct link :
NetAddr::IP | [reply] |
| [reply] [d/l] |