[摘要]flag == 2 ) buf = fread (this->fp , 3 ) ;if (flag == 2 )this->CountryFlag = 2 ;this->EndIp... $flag == 2 ) { $buf = fread ($this->fp , 3 ) ; if ($flag == 2 ){ $this->CountryFlag = 2 ; $this->EndIpOff = $offset - 4 ; } $offset = ord($buf[0]) + (ord($buf[1])*256) + (ord($buf[2])* 256*256); }else{ break ; }
} if ( $offset < 12 ) return ''; @fseek($this->fp , $offset , SEEK_SET ) ; return $this->getStr(); } function getStr ( ) { $str = '' ; while ( 1 ) { $c = fgetc ( $this->fp ) ; if ( ord ( $c[0] ) == 0) break ; $str .= $c ; } return $str ; }
function qqwry ($dotip) {
$nRet; $ip = IpToInt ( $dotip );
$this->fp= @fopen(QQWRY, "rb"); if ($this->fp == NULL) { $szLocal= "OpenFileError"; return 1;
} @fseek ( $this->fp , 0 , SEEK_SET ) ; $buf = fread ( $this->fp , 8 ) ; $this->FirstStartIp = ord($buf[0]) + (ord($buf[1])*256) + (ord($buf[2])*256*256) + (ord($buf[3])*256*256*256); $this->LastStartIp= ord($buf[4]) + (ord($buf[5])*256) + (ord($buf[6])*256*256) + (ord($buf[7])*256*256*256);
$RecordCount= floor( ( $this->LastStartIp - $this->FirstStartIp ) / 7); if ($RecordCount <= 1){ $this->Country = "FileDataError"; fclose ( $this->fp ) ; return 2 ; }
$RangB= 0; $RangE= $RecordCount; // Match ... while ($RangB < $RangE-1) { $RecNo= floor(($RangB + $RangE) / 2); $this->getStartIp ( $RecNo ) ;
if ( $ip == $this->StartIp ) { $RangB = $RecNo ; break ; } if ( $ip > $this->StartIp) $RangB= $RecNo; else $RangE= $RecNo; } $this->getStartIp ( $RangB ) ; $this->getEndIp ( ) ;
if ( ( $this->StartIp<= $ip ) && ( $this->EndIp >= $ip ) ){ $nRet = 0 ; $this->getCountry ( ) ; //这样不太好..............所以.......... $this->Local = str_replace("(我们一定要解放台湾!!!)", "", $this->Local);
}else { $nRet = 3 ; $this->Country = '未知' ; $this->Local = '' ; } fclose ( $this->fp ) ; return $nRet ; } }
function ip2location ( $ip ) { $wry = new TQQwry ; $nRet = $wry->qqwry ( $ip ); //可以利用 $nRet做一些事情,我是让他自动记录未知IP到一个表,代码就不写了。 return $wry->Country.$wry->Local ; }
|
关键词: QQwry.dat格式区分与查询IP位置的PHP程序