-
- /**
- * Get city name based on IP address Innocence IP database
- * edit: bbs.it-home.org
- */
- function convertip($ip) {
- //IP data file path
- $dat_path = 'QQWry.Dat';
-
- //Check IP address
- if(!filter_var($ip, FILTER_VALIDATE_IP)) {
- return 'IP Address Error';
- }
- //Open IP data file
- if(!$fd = @fopen($dat_path, 'rb')){
- return 'IP date file not exists or access denied';
- }
-
- //Decompose the IP for operation and get an integer number
- $ipNum = ip2long($ip);
-
- //Get the start and end position of the IP data index
- $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; //Use binary search method to search for matching IP records from the index records while($ip1num>$ ipNum || $ip2num<$ipNum) {
- $Middle= intval(($EndNum + $BeginNum) / 2);
-
- //Offset the pointer to the index position and read 4 bytes
- fseek($fd, $ ipbegin + 7 * $Middle);
- $ipData1 = fread($fd, 4);
- if(strlen($ipData1) < 4) {
- fclose($fd);
- return 'System Error';
- }
- //The extracted data is converted into a long integer. If the data is a negative number, add 2 to the 32nd power
- $ip1num = implode('', unpack('L', $ipData1));
- if($ip1num < 0 ) $ip1num += pow(2, 32); //If the extracted long integer is greater than our IP address, modify the end position for the next cycle if($ip1num > $ipNum) {
- $EndNum = $Middle;
- continue;
- }
-
- //Get the next index after fetching the previous index
- $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);
-
- //Unknown prompt not found
- if($ip2num < $ipNum) {
- if($Middle = = $BeginNum) {
- fclose($fd);
- return 'Unknown';
- }
- $BeginNum = $Middle;
- }
- }
-
- //The following code is confusing to read. I don’t understand it. I’m interested. Slow reading
- $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;
- }
- 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");
-
- ?>
复制代码
|