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 } ?>