I ran across this problem with php 5.0.2 in Linux. This problem did not exist before 
and this code was used in php 5.0.0, 5.0.1, 5.0.2-dev, and several other cvs snaps 
along the way -all on Linux.

<?php
// example
// network IP and mask
$range = '192.168.0.0/24';

list($ip,$mask) = explode('/', $range);

// Calculate the number of hosts.
$numHosts = pow(2, (32 - $mask));

print "num hosts: $numHosts<br>\n";

// Netmask = fullmask - number of hosts.
$netmask = pow(2, 32) - $numHosts;

print "netmask: $netmask<br>\n";
print "human readable netmask: " . long2ip($netmask) . "<br>\n";

// address to number
$ipLong = ip2long($ip);

print "ip2long ip: $ipLong<br>\n";

// here is where the problem is:
print "(\$ipLong & \$netmask): ".($ipLong & $netmask)."<br>\n";
// PHP 5.0.2-dev (cli) (built: Sep 21 2004 14:39:26)
// prints out "-1062731776"
//PHP 5.0.2 (cli) (built: Sep 24 2004 13:58:57)
// prints out "1084751872"

// ...and so the following always fails:
// If the ip is not equal to (itself & netmask) it cannot be on the network boundary
if ($ipLong != ($ipLong & $netmask))
 echo "Ip NOT on network boundary!";
else
 echo "Ip IS on network boundary!";
?>

I'm sure there are other ways to test if an ip is on a the network boundary of a given 
CIDR and I'll appreciate any examples of that. However, I am more interested in why 
and'ing these two numbers returns a different value now. I'm unable to find any clues 
in the docs.

Thanks,

Jim Grill

Reply via email to