-
- /**
- * 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 레코드를 검색합니다. 인덱스 레코드에서 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);
- '시스템 오류' 반환 ;
- }
- $DataSeek = implode('', unpack('L', $DataSeek.chr(0)));
- fseek($fd, $DataSeek );
- $ipData2 = fread($fd, 4);
- if(strlen($ipData2) < 4) {
- 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 '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 오류';
- }
- $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 '시스템 오류';
- }
- $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 = '알 수 없음';
- }
-
- $ipaddr 반환;
- }
- header("콘텐츠 유형: 텍스트/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");
-
- ?>
코드 복사
|