為了檢測客戶端ip是否位於指定的網絡里(如防火牆過濾有時候需要用到這個技術),有如下方法:
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'; }