php根据ip段以及子网掩码,判断某ip是否处于某子网下
2015-04-13 14:59
585 查看
为了检测客户端ip是否位于指定的网络里(如防火墙过滤有时候需要用到这个技术),有如下方法:
1、第一种
2、第二种
1、客户端ip,假设符号是D
2、该网络下的ip地址段,假设符号是N
3、该网络下的子网掩码,假设符号是M
那么,如果客户端ip处于该网络下,应该会满足:
N==(D&M)
文字解释就是,用客户端ip和子网掩码进行与操作,所得结果应该与该网络下的ip段相等。不过注意一个问题,上面的公式,是用二进制进行计算的,并不是我们常见的点分十进制的ip地址。也就是说,我们获得客户端ip后,应该把它转换为32位二进制数字再进行计算。
代码如下:
1、第一种
public function netMatch($client_ip, $server_ip, $mask) { $mask1 = 32 - $mask; return ((ip2long($client_ip) >> $mask1) == (ip2long($server_ip) >> $mask1)); } $client_ip = '192.168.1.15'; $server_ip = '192.168.1.1'; $mask = 24; $res = netMatch( $dev_ip, $server_ip , $mask );
2、第二种
1、客户端ip,假设符号是D
2、该网络下的ip地址段,假设符号是N
3、该网络下的子网掩码,假设符号是M
那么,如果客户端ip处于该网络下,应该会满足:
N==(D&M)
文字解释就是,用客户端ip和子网掩码进行与操作,所得结果应该与该网络下的ip段相等。不过注意一个问题,上面的公式,是用二进制进行计算的,并不是我们常见的点分十进制的ip地址。也就是说,我们获得客户端ip后,应该把它转换为32位二进制数字再进行计算。
代码如下:
function ip_binay($ip) { $ip_array = explode(".",$ip); $t = ''; foreach($ip_array as $v) { $tmp = decbin($v); $tmp_len = strlen(decbin($v)); if($tmp_len < 8) $t .= str_repeat( "0",(8 - $tmp_len) ).$tmp; else $t .= $tmp; } return $t; } $server_ip = "0.0.0.0"; //地址段 $mask_ip = "0.0.0.0"; //子网掩码 $client_ip='192.168.1.11';//客户端ip $D=ip_binay($client_ip); $is_ip_in=0; $M = ip_binay($mask_ip); $temp = $D & $M; $N = ip_binay( $server_ip ); if( $temp == $N ){ $is_ip_in=1; } if($is_ip_in){ echo "你的ip处于该网络下!"; }else{ echo 'NO'; }
相关文章推荐
- 根据ip和子网掩码判断两个ip是否在同一个子网
- PHP 根据身份证号码,获取性别、获取生日、计算年龄、获取地址、获取生肖、获取星座、以及判断是否是身份证号
- 根据IP和子网掩码,判断ip是否属于子网
- 判断IP及子网掩码是否合法(C语言实现)
- PHP根据IP判断地区名信息
- php正则表达式判断是否为ip格式
- 当GridView处于编辑状态时,需要判断是否继续,并根据判断执行下一步操作
- php判断ip的地址是否合法
- PHP获取IP地址及根据IP判断城市实…
- php和js根据子网掩码和ip计算子网
- PHP获取IP地址及根据IP判断城市实现城市切换或跳转
- PHP 判断指定IP,是否在一个IP段里
- paip.判断字符是否中文与以及判读是否是汉字uapi python java php
- linux中读取网卡信息(ip, mask, mac)以及判断物理网线是否插好的C程序---我亲自试了一下,还不错!
- 如何实现网站根据ip判断地区 自动跳转到所属地区页面【PHP版】
- php學習 --- 调节器 以及如何判断一个字符串是否是邮件
- php 根据ip获取城市以及网络运营商名称(利用qqwry.dat)
- PHP判断IP是否在某个网络内
- Python判断IP是否属于某子网
- 根据weekNo(本周为0,上周为-1,下周为1),week(Calendar.XXX)获取日期,以及根据weekNo和week判断今天是否是该日期