做项目需要用到,网上找了一下,发现网上的有点错误,自己再改良了一下,顺便温习了一下网络知识。
具体思路如下:
列子:192.168.1.0/20
可用的地址长度为:2^(32-20)=4096 再减去开头结尾两个地址即4094个
/20为子网掩码,即32位二进制掩码从左到右共有20位1,即还有12个0
即是如下:
11111111.11111111.11110000.00000000 表示255.255.240.0
与ip地址192.168.1.0做与运算得出第一个网络地址
第一个网络地址加上地址长度即可算出最后一个地址,用ip2long();
function ip_in_network($ip, $network)
{
$ip = (double) (sprintf("%u", ip2long($ip))); //ip to long
$s = explode('/', $network);
$mask = 0xffffffff<<(32 - $s[1]);//ip mask
$network_start = (double) (sprintf("%u", ip2long($s[0])&$mask)); //Start ip
$network_len = pow(2, 32 - $s[1]); ///network Lengh
$network_end = $network_start + $network_len - 1; //End ip
// echo "Start IP:".long2ip($network_start)."<br>End IP:".long2ip($network_end);
if ($ip >= $network_start && $ip <= $network_end)
{
return true;
}
return false;
}