Jump to content

Archived

This topic is now archived and is closed to further replies.

node142e4

Is ipaddress in network?

Recommended Posts

Hello All,

I am trying to determine if an ip-address with a notation like 192.168.1.312
is in a network described with a notation like this 192.168.1.0/22

I use an online tool IP calculator from
[a href=\"http://jodies.de/ipcalc?host=192.168.1.0&mask1=22&mask2=\" target=\"_blank\"]http://jodies.de/ipcalc?host=192.168.1.0&mask1=22&mask2=[/a]
this is the output:
[code]
Address:   192.168.1.0           11000000.10101000.000000 01.00000000
Netmask:   255.255.252.0 = 22    11111111.11111111.111111 00.00000000
Wildcard:  0.0.3.255             00000000.00000000.000000 11.11111111
=>
Network:   192.168.0.0/22        11000000.10101000.000000 00.00000000 (Class C)
Broadcast: 192.168.3.255         11000000.10101000.000000 11.11111111
HostMin:   192.168.0.1           11000000.10101000.000000 00.00000001
HostMax:   192.168.3.254         11000000.10101000.000000 11.11111110
Hosts/Net: 1022                  (Private Internet)
[/code]

This shows that my example ip address is indeed in the network.
To do this dynamically, all I can think of now is to put all 1022 ipaddresses in my db, and do a select where ... query.
There must be a better way.

Thanks very much in advance for any help or suggestions,


node142e4

Share this post


Link to post
Share on other sites
First step: translate 192.168.1.0/22 into something you can use as a mask. 192.168.1.0/22 means that the first 22 bits of the IP in question must be identical to the first 22 bits in the base IP.

BTW, each octet of the IP can be at most 255, so your sample IP of 192.168.1.312 was invalid.

Untested code:
[code=php:0]
// Expects $base_ip and $ip to be in dotted format
function in_network( $base_id, $bit, $ip)
{
$base_ip = ip2long( $base_ip );
$test1 = $base_ip >> ( 32 - $bits )
$ip = ip2long($ip);
$test2 = $ip >> (32 - $bits );
return $test1 == $test2;
}

if ( in_network('192.168.1.0', 22, '192.168.1.212') )
{
echo "Same network!";
}
else
{
echo "Different network!";
}
[/code]

Share this post


Link to post
Share on other sites
Thank you very much!

besides two typos in the function signature, you're code works perfectly.
I rarely have use for bitwise operators, but I do understand your solution and it is very nice and fast.


cheers,


node142e4

Share this post


Link to post
Share on other sites

×

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.