利用ip地址和子网掩码来计算该网段最多主机数的php代码

在网上有这样一道题:网络地址172.16.22.38/27 请写出此地址的子网ID以及广播地址,此地址所处子网有多少台主机及可用主机数?请告知稍微详细的计算步骤哦。我用php来计算了一下,最大子网数没算。
代码:
<?php
$ip = "172.16.22.38"; //可根据需要换成你需要的ip地址
$mask="255.255.255.224"; //子网掩码只支持前3位为255,尾数128 192 224 240 248 252格式,为0就不用算了吧
$c=explode(".",get_net($ip,$mask));
$d=explode(".",$mask);
$tag = str_replace("1", "2",decbin($d[3]));
$tagtwo=str_replace("0", "1", $tag);
$tagthree=str_replace("2", "0", $tagtwo);
$last=bindec($tagthree)."<br>";
$e=get_nets($ip,"$d[0].$d[1].$d[2].$last");
$arr1 =explode(".",$e);
$re=$arr1[3]-$c[3]-1;
$ip1=$c[3]+1;

echo "你输入的ip为$ip,子网掩码为$mask<br>该主机所在ip段为$c[0].$c[1].$c[2].$c[3]--$c[0].$c[1].$c[2].$arr1[3]<br>该子网可容纳最大主机数为$re<br>广播地址为$c[0].$c[1].$c[2].$arr1[3],第一个可用主机ip为$c[0].$c[1].$c[2].$ip1<br>最大子网数没算,有点晕,这个程序本来开始就设计得不合理,太多bug,不想重来了";
   

function get_net($ip,$hide)
{
$a = explode(".",$ip);
$b = explode(".",$hide);
for($i=0;$i<4;$i++)
    $r[$i] = (int)$a[$i] & (int)$b[$i];
return join(".",$r);
}

function get_nets($ip,$hide)
{
$a = explode(".",$ip);
$b = explode(".",$hide);
for($i=0;$i<4;$i++)
    $r[$i] = (int)$a[$i] | (int)$b[$i];
return join(".",$r);
}
?>

你可能感兴趣的:(职场,IP地址,休闲,子网掩码)