-
- /*---------------------------- -------------
- ip2address [qqwry.dat]
- ------------ - -------------------------------------*/
- 클래스 IP {
- var $ fh ; //IP 데이터베이스 파일 핸들
- var $first; //첫번째 인덱스
- var $last; //마지막 인덱스
- var $total; //전체 인덱스
- 🎜> function __construct() {
- $this->fh = fopen('qqwry.dat', 'rb'); //qqwry.dat 파일
- $this->first = $this- > ;getLong4();
- $this->last = $this->getLong4();
- $this->total = ($this->last - $this->first) / 7; //각 인덱스는 7바이트입니다
- }
- //IP 유효성 확인
- function checkIp($ip) {
- $arr =explore('.',$ip)
- if(count($arr) !=4 ) {
- return false;
- } else {
- for ($i=0; $i < 4; $i ) {
- if ($ arr[$i] <'0' || $arr[$i] > '255') {
- false 반환;
- }
- }
- }
- true 반환;
- }
- function getLong4() {
- //리틀 엔디안 인코딩의 4바이트를 읽고 긴 정수로 변환합니다.
- $result = unpack('Vlong', fread( $this-> ;fh, 4));
- return $result['long'];
- }
- function getLong3() {
- //리틀 엔디안 인코딩의 3단어 읽기 섹션을 긴 정수로 변환
- $result = unpack('Vlong', fread($this->fh, 3).chr(0));
- return $result['long'];
- }
- // 정보 조회
- function getInfo($data = "") {
- $char = fread($this->fh, 1);
- while (ord($char ) != 0) { // 국가 및 지역 정보는 0으로 끝납니다
- $data .= $char;
- $char = fread($this->fh, 1);
- }
- return $data;
- } bbs.it-home.org
- //지역 정보 조회
- function getArea() {
- $byte = fread($this->fh, 1) // 플래그 바이트
- 스위치( ord($byte)) {
- 사례 0: $area = ''; break; //지역 정보 없음
- 사례 1: //지역이 리디렉션됨
- fseek ($this->fh, $ this->getLong3());
- $area = $this->getInfo(); break;
- 사례 2: //영역이 리디렉션됩니다
- fseek($this->fh, $ this->getLong3());
- $area = $this->getInfo(); break;
- 기본값: $area = $this->getInfo ($byte); 영역이 리디렉션되지 않습니다
- }
- return $area;
- }
- function ip2addr($ip) {
- if(!$this -> checkIp($ip)){
- return false;
- }
- $ip = pack('N', intval(ip2long($ip)));
- //이진 검색
- $ l = 0;
- $r = $this->total;
- while($l <= $r) {
- $m = Floor(($l $r) / 2) / /중간 지수 계산
- fseek($ this->fh, $this->first $m * 7);
- $beginip = strrev(fread($this->fh, 4)) ///중간 인덱스의 시작 IP 주소
- fseek($this->fh, $this->getLong3());
- $endip = strrev(fread($this->fh, 4)) //중간 인덱스의 IP 주소 끝
- if ($ip < $beginip) { //사용자의 IP가 중간 인덱스의 시작 IP 주소보다 작은 경우
- $r = $m - 1;
- } else {
- if ($ip > $endip) { //사용자의 IP가 중간 인덱스의 끝 IP 주소보다 큰 경우
- $l = $m 1;
- } else { //사용자의 IP는 중간 인덱스 IP 범위 내에 있는 경우
- $findip = $this->first $m * 7;
- break;
- }
- }
- }
- //국가 및 지역 쿼리 information
- fseek($this->fh, $findip);
- $location['beginip'] = long2ip($this->getLong4()); //사용자 IP 범위의 시작 주소
- $ offset = $this->getlong3();
- fseek($this->fh, $offset);
- $location['endip'] = long2ip($this->getLong4 ()); //사용자 IP 범위의 끝 주소
- $byte = fread($this->fh, 1) //플래그 바이트
- 스위치(ord($byte)) {
- 사례 1: //국가 및 지역 정보가 모두 리디렉션됩니다
- $countryOffset = $this->getLong3() //주소 리디렉션
- fseek($this->fh, $countryOffset);
- $ byte = fread($this->fh, 1); //플래그 바이트
- switch (ord($byte)) {
- 사례 2: //국가 정보가 두 번 리디렉션됩니다.
- fseek ($ this->fh, $this->getLong3());
- $location['country'] = $this->getInfo();
- fseek($this->fh, $countryOffset 4);
- $location['area'] = $this->getArea();
- break;
- 기본값: //국가 정보는 두 번 리디렉션되지 않습니다.
- $location ['국가' ] = $this->getInfo($byte);
- $location['area'] = $this->getArea();
- break;
- }
- break ;
- 사례 2: //국가 정보가 리디렉션됩니다
- fseek($this->fh, $this->getLong3());
- $location['country'] = $this- >getInfo() ;
- fseek($this->fh, $offset 8);
- $location['area'] = $this->getArea();
- break;
- 기본값: // 국가 정보는 리디렉션되지 않습니다
- $location['country'] = $this->getInfo($byte);
- $location['area'] = $this->getArea ();
- 휴식;
- }
- //gb2312를 utf-8로 (정보가 없을 때 표시되는 CZ88.NET 제거)
- foreach ($location as $k => $v) {
- $location[$k] = str_replace ( 'CZ88.NET','',iconv('gb2312', 'utf-8', $v));
- }
- return $location;
- }
- //소멸자
- function __destruct() {
- fclose($this->fh);
- }
- }
- $ip = 새 ip();
- $addr = $ip -> ('IP 주소');
- print_r($addr);
- ?>
코드 복사
|