显IP功能
?注意:該函數只適用于windows系統,另一個支持linux系統的代碼,請參閱《顯IP功能(二)》
<? //=================================== // // 功能:IP地址獲取真實地址函數 // 參數:$ip - IP地址 // 作者:[Discuz!] (C) Comsenz Inc. // //=================================== function convertip($ip) {//IP數據文件路徑$dat_path = 'QQWry.dat';//檢查IP地址if(!ereg("^([0-9]{1,3}.){3}[0-9]{1,3}$", $ip)){return 'IP Address Error';}//打開IP數據文件if(!$fd = @fopen($dat_path, 'rb')){return 'IP date file not exists or access denied';}//分解IP進行運算,得出整形數$ip = explode('.', $ip);$ipNum = $ip[0] * 16777216 + $ip[1] * 65536 + $ip[2] * 256 + $ip[3];//獲取IP數據索引開始和結束位置$DataBegin = fread($fd, 4);$DataEnd = fread($fd, 4);$ipbegin = implode('', unpack('L', $DataBegin));if($ipbegin < 0) $ipbegin += pow(2, 32);$ipend = implode('', unpack('L', $DataEnd));if($ipend < 0) $ipend += pow(2, 32);$ipAllNum = ($ipend - $ipbegin) / 7 + 1;$BeginNum = 0;$EndNum = $ipAllNum;//使用二分查找法從索引記錄中搜索匹配的IP記錄while($ip1num>$ipNum || $ip2num<$ipNum) {$Middle= intval(($EndNum + $BeginNum) / 2);//偏移指針到索引位置讀取4個字節fseek($fd, $ipbegin + 7 * $Middle);$ipData1 = fread($fd, 4);if(strlen($ipData1) < 4) {fclose($fd);return 'System Error';}//提取出來的數據轉換成長整形,如果數據是負數則加上2的32次冪$ip1num = implode('', unpack('L', $ipData1));if($ip1num < 0) $ip1num += pow(2, 32);//提取的長整型數大于我們IP地址則修改結束位置進行下一次循環if($ip1num > $ipNum) {$EndNum = $Middle;continue;}//取完上一個索引后取下一個索引$DataSeek = fread($fd, 3);if(strlen($DataSeek) < 3) {fclose($fd);return 'System Error';}$DataSeek = implode('', unpack('L', $DataSeek.chr(0)));fseek($fd, $DataSeek);$ipData2 = fread($fd, 4);if(strlen($ipData2) < 4) {fclose($fd);return 'System Error';}$ip2num = implode('', unpack('L', $ipData2));if($ip2num < 0) $ip2num += pow(2, 32);//沒找到提示未知if($ip2num < $ipNum) {if($Middle == $BeginNum) {fclose($fd);return 'Unknown';}$BeginNum = $Middle;}}//下面的代碼讀暈了,沒讀明白,有興趣的慢慢讀$ipFlag = fread($fd, 1);if($ipFlag == chr(1)) {$ipSeek = fread($fd, 3);if(strlen($ipSeek) < 3) {fclose($fd);return 'System Error';}$ipSeek = implode('', unpack('L', $ipSeek.chr(0)));fseek($fd, $ipSeek);$ipFlag = fread($fd, 1);}if($ipFlag == chr(2)) {$AddrSeek = fread($fd, 3);if(strlen($AddrSeek) < 3) {fclose($fd);return 'System Error';}$ipFlag = fread($fd, 1);if($ipFlag == chr(2)) {$AddrSeek2 = fread($fd, 3);if(strlen($AddrSeek2) < 3) {fclose($fd);return 'System Error';}$AddrSeek2 = implode('', unpack('L', $AddrSeek2.chr(0)));fseek($fd, $AddrSeek2);} else {fseek($fd, -1, SEEK_CUR);}while(($char = fread($fd, 1)) != chr(0))$ipAddr2 .= $char;$AddrSeek = implode('', unpack('L', $AddrSeek.chr(0)));fseek($fd, $AddrSeek);while(($char = fread($fd, 1)) != chr(0))$ipAddr1 .= $char;} else {fseek($fd, -1, SEEK_CUR);while(($char = fread($fd, 1)) != chr(0))$ipAddr1 .= $char;$ipFlag = fread($fd, 1);if($ipFlag == chr(2)) {$AddrSeek2 = fread($fd, 3);if(strlen($AddrSeek2) < 3) {fclose($fd);return 'System Error';}$AddrSeek2 = implode('', unpack('L', $AddrSeek2.chr(0)));fseek($fd, $AddrSeek2);} else {fseek($fd, -1, SEEK_CUR);}while(($char = fread($fd, 1)) != chr(0)){$ipAddr2 .= $char;}}fclose($fd);//最后做相應的替換操作后返回結果if(preg_match('/http/i', $ipAddr2)) {$ipAddr2 = '';}$ipaddr = "$ipAddr1 $ipAddr2";$ipaddr = preg_replace('/CZ88.Net/is', '', $ipaddr);$ipaddr = preg_replace('/^s*/is', '', $ipaddr);$ipaddr = preg_replace('/s*$/is', '', $ipaddr);if(preg_match('/http/i', $ipaddr) || $ipaddr == '') {$ipaddr = 'Unknown';}return $ipaddr; }//======================== // // 調用舉例(速度很快) // //========================echo convertip('219.238.235.10')."<br>"; //輸出: 北京市 電信通echo convertip('23.56.82.12')."<br>"; //輸出:IANAecho convertip('250.69.52.0')."<br>"; //輸出:IANA保留地址echo convertip('238.69.52.0')."<br>"; //輸出:IANA保留地址 用于多點傳送echo convertip('192.168.0.1')."<br>"; //輸出:局域網 對方和您在同一內部網echo convertip('255.255.255.255')."<br>"; //輸出:純真網絡 2006年11月20日IP數據echo convertip('212.102.33.4')."<br>";?>
總結
- 上一篇: python数据分析项目实战—————链
- 下一篇: 威胁建模主流框架