-
- /**
- * IP アドレスに基づいて都市名を取得する Innocence IP データベース
- * 編集: bbs.it-home.org
- */
- function Convertip($ip) {
- //IP データ ファイル パス
- $dat_path = 'QQWry.Dat';
-
- //IP アドレスを確認する
- if(!filter_var($ip, FILTER_VALIDATE_IP)) {
- return 'IP アドレス エラー';
- }
- //IP データ ファイルを開く
- if(!$fd = @fopen($dat_path, 'rb')){
- return 'IP 日付ファイルが存在しないか、アクセスが拒否されました';
- }
-
- //操作用の IP を分解し、整数を取得します
- $ipNum = ip2long($ip);
-
- //データの開始位置と終了位置を取得します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 = $ipAllNum; // インデックス レコードから一致する IP レコードを検索します。 ($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 'システム エラー' ;
- }
- //抽出したデータを長整数に変換し、データが負の場合は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) fclose($fd);
- return 'システム エラー';
- }
- $DataSeek = implode('', unpack('L', $DataSeek.chr(0)));
- fseek($fd, $ DataSeek);
- $ipData2 = fread( $fd, 4);
- if(strlen($ipData2) fclose($fd);
- return 'システム エラー';
- }
- $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 'システム エラー';
- }
- $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 'システム エラー';
- }
- $ipFlag = fread($fd, 1);
- if ($ipFlag == chr(2)) {
- $AddrSeek2 = fread($fd, 3);
- if(strlen($AddrSeek2) < 3) {
- fclose($fd);
- return 'システム エラー';
- }
- $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 'システム エラー';
- }
- $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 = '不明';
- }
-
- return $ipaddr;
- }
- header("Content-type: text/html; charset=utf-8");
- $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
- if (isset($_GET['q'])){
- $ip = $_GET['q'];
- if(filter_var("http://".$ip,FILTER_VALIDATE_URL,FILTER_FLAG_HOST_REQUIRED)){
- $ip = gethostbyname($ip);
- }
- }
- echo "$ip,".mb_convert_encoding(convertip($ip),"utf-8","gb2312");
-
- ?>
复制發
|