PHP对IP段解析的方法(子网掩码,广播地址,可用IP数,兼容32位)

  •   
  • 8659
  • PHP
  • 0
  • super_dodo
  • 2013/11/08

最近需要做一个功能方便系统管理员通过ip段地址很清楚的了解到该ip段的子网掩码,广播地址,可用IP数,可用IP开始,可用IP结束等。现在做的是当点击检测IP段按钮的时候使用ajax去取数据之后渲染到页面。

备注:dodo使用的是Yii框架,这里贴出来的是控制器和视图层的部分.若需要采用,请适当的调整优化。

QQ截图20131108114705

/* 检测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('<tr class="even"><td class="ips_tit">子网掩码</td><td class="ips_tip">'+data.subnet_mask+'</td>'+
			'<td class="ips_tit">可用IP数目</td><td class="ips_tip">'+data.avi_num+'</td></tr>'+
			'<tr><td class="ips_tit">可用IP开始</td><td class="ips_tip">'+data.ip_start+'</td>'+
			'<td class="ips_tit">可用IP结束</td><td class="ips_tip">'+data.ip_end+'</td></tr>'+
			'<tr class="even"><td class="ips_tit">子网地址</td><td class="ips_tip">'+data.nw+'</td>'+
			'<td class="ips_tit">广播地址</td><td class="ips_tip">'+data.bc+'</td></tr>');
	});
	return false;
});