最近需要做一个功能方便系统管理员通过ip段地址很清楚的了解到该ip段的子网掩码,广播地址,可用IP数,可用IP开始,可用IP结束等。现在做的是当点击检测IP段按钮的时候使用ajax去取数据之后渲染到页面。
备注:dodo使用的是Yii框架,这里贴出来的是控制器和视图层的部分.若需要采用,请适当的调整优化。
/* 检测IP段内IP段地址(192.168.1.10/24)
* 传入Ip地址对Ip段地址进行处理得到相关的信息
*/
public function actionCheckIps($ip_addr) {
$ip_addr = str_replace(" ","",$ip_addr);//去除字符串中的空格
$arr = explode('/',$ip_addr);//对IP段进行解剖
$ip_addr = $arr[0];//得到IP地址
$netbits = intval($arr[1]);//得到掩码位
$subnet_mask = long2ip(ip2long("255.255.255.255") << (32 - $netbits));
$ip = ip2long($ip_addr);
$nm = ip2long($subnet_mask);
$nw = ($ip & $nm);
$bc = $nw | (~$nm);
$ips = array();
$ips['subnet_mask'] = long2ip($nm);//子网掩码
$ips['avi_num'] = ($bc - $nw - 1);//可用IP数目
if($ips['avi_num'] <= 0){
$ips['avi_num'] += 4294967296;
}
$ips['ip_start'] = long2ip($nw + 1);//可用IP开始
$ips['ip_end'] = long2ip($bc - 1);//可用IP结束
if($bc <= 0) $bc += 4294967296;//修复32位服务器和64位服务的差别
if($nw <= 0) $nw += 4294967296;//32位long2ip后会出现负数
// $bc = sprintf('%u',$bc); //或者采用此方法转换成无符号的
// $nw = sprintf('%u',$nw);
$ips['nw'] = long2ip($nw);//子网地址
$ips['bc'] = long2ip($bc);//广播地址
echo json_encode($ips);//返回JSON格式方便前端AJAX处理
}
[/php]
前端HTML页面用于用户操作和信息展示
[code lang="html"]
IP段:
示例:192.168.1.10/24 (中间不需要空格)
[/code]
前端jQuery使用ajax去获取数据
$("#chk_ips").click(function(){
$('.ips_info').empty();
var ip_addr = $("#ips").val();
if(ip_addr == '') return false;
$.getJSON("/checkIps", {ip_addr:$("#ips").val()}, function(data){
$('.ips_info').html('
子网掩码'+data.subnet_mask+''+'
可用IP数目'+data.avi_num+''+'
可用IP开始'+data.ip_start+''+'
可用IP结束'+data.ip_end+''+'
子网地址'+data.nw+''+'
广播地址'+data.bc+'');});
return false;
});