www.gusucode.com > 仿51.com的php源码 1.1 > ip/ip.class.php

    <?
/*	纯真IP数据库IP位置检测PHP程序类
	代码 http://www.nicenic.com 耐思尼克.IceFire
	下载 http://www.51pr.com
	QQ:8112898
	转载使用请保留此信息,感谢您的使用
*/
class IP{
	function Get($ipStr=""){
		if(!$ipStr){
		   if (getenv("HTTP_CLIENT_IP") && strcasecmp(getenv("HTTP_CLIENT_IP"), "unknown"))
				   $ip = getenv("HTTP_CLIENT_IP");
			   else if (getenv("HTTP_X_FORWARDED_FOR") && strcasecmp(getenv("HTTP_X_FORWARDED_FOR"), "unknown"))
				   $ip = getenv("HTTP_X_FORWARDED_FOR");
			   else if (getenv("REMOTE_ADDR") && strcasecmp(getenv("REMOTE_ADDR"), "unknown"))
				   $ip = getenv("REMOTE_ADDR");
			   else if (isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], "unknown"))
				   $ip = $_SERVER['REMOTE_ADDR'];
			   else
				   $ip = "unknown";
		}else{
			if(!preg_match("/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/",$ip)){ 
				$ip=gethostbyname($ipStr);
			}else{
				$ip=$ipStr;
			}
		
		}

	   return($ip);
	}

	function Convert($ip){ 
		$ip=$this->Get($ip);

		if($fd=@fopen('../ip/data/QQWry.dat','rb')){//fopen()中是纯真ip数据库文件位置,请自行设定! 

		$ip=explode('.',$ip); 
		$ipNum=$ip[0]*16777216+$ip[1]*65536+$ip[2]*256+$ip[3]; 

		$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; 

		while($ip1num>$ipNum||$ip2num<$ipNum){ 
		$Middle=intval(($EndNum+$BeginNum)/2); 

		fseek($fd,$ipbegin+7*$Middle); 
			$ipData1=fread($fd,4); 
			if(strlen($ipData1)<4){ 
			fclose($fd); 
			return'系统错误'; 
		} 
		$ip1num=implode('',unpack('L',$ipData1)); 
		if($ip1num<0)$ip1num+=pow(2,32); 

		if($ip1num>$ipNum){ 
		$EndNum=$Middle; 
		continue; 
		} 

		$DataSeek=fread($fd,3); 
		if(strlen($DataSeek)<3){ 
		fclose($fd); 
		return'系统错误'; 
		} 
		$DataSeek=implode('',unpack('L',$DataSeek.chr(0))); 
		fseek($fd,$DataSeek); 
		$ipData2=fread($fd,4); 
		if(strlen($ipData2)<4){ 
		fclose($fd); 
		return'SystemError'; 
		} 
		$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'SystemError'; 
		} 
		$ipFlag=fread($fd,1); 
		if($ipFlag==chr(2)){ 
		$AddrSeek2=fread($fd,3); 
		if(strlen($AddrSeek2)<3){ 
		fclose($fd); 
		return'SystemError'; 
		} 
		$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'SystemError'; 
		} 
		$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; 

		}else{ 

		$datadir=DISCUZ_ROOT.'./ipdata/'; 
		$ip_detail=explode('.',$ip); 
		if(file_exists($datadir.$ip_detail[0].'.txt')){ 
		$ip_fdata=@fopen($datadir.$ip_detail[0].'.txt','r'); 
		}else{ 
		if(!($ip_fdata=@fopen($datadir.'0.txt','r'))){ 
		return'InvalidIPdatafile'; 
		} 
		} 
		for($i=0;$i<=3;$i++){ 
		$ip_detail[$i]=sprintf('%03d',$ip_detail[$i]); 
		} 
		$ip=join('.',$ip_detail); 
		do{ 
		$ip_data=fgets($ip_fdata,200); 
		$ip_data_detail=explode('|',$ip_data); 
		if($ip>=$ip_data_detail[0]&&$ip<=$ip_data_detail[1]){ 
		fclose($ip_fdata); 
		return$ip_data_detail[2].$ip_data_detail[3]; 
		} 
		}while(!feof($ip_fdata)); 
		fclose($ip_fdata); 
		return'未知地址'; 

		} 

	} 
//结束class
}
?>