function convertip($ip,$integrity='simple'){
002
$return='';
003
$integrity=in_array($integrity,array('simple','full'))?$integrity:'simple';
004
if(preg_match("/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/",$ip)){
005
$iparray=explode('.',$ip);
006
if($iparray[0]==10||$iparray[0]==127||($iparray[0]==192&&$iparray[1]==168)||($iparray[0]==172&&($iparray[1]>=16&&$iparray[1]<=31))){
007
$return='- LAN';
008
}elseif($iparray[0]>255||$iparray[1]>255||$iparray[2]>255||$iparray[3]>255){
009
$return='- Invalid IP Address';
010
}else{
011
$tinyipfile=WEB_ROOT.'./tinyipdata.dat';//IP==地址数据包精简版
012
$fullipfile=WEB_ROOT.'./wry.dat';//IP==地址数据包完整版
013
if($integrity=='simple'&&@file_exists($tinyipfile)){
014
$return=convertip_tiny($ip,$tinyipfile);
015
}elseif(@file_exists($fullipfile)){
016
$return=convertip_full($ip,$fullipfile);
017
}
018
}
019
}
020
return $return;
021
}
022
function convertip_tiny($ip,$ipdatafile){
023
static $fp=NULL,$offset=array(),$index=NULL;
024
$ipdot=explode('.',$ip);
025
$ip=pack('N',ip2long($ip));
026
$ipdot[0]=(int)$ipdot[0];
027
$ipdot[1]=(int)$ipdot[1];
028
if($fp===NULL&&$fp=@fopen($ipdatafile,'rb')){
029
$offset=@unpack('Nlen',@fread($fp,4));
030
$index=@fread($fp,$offset['len']-4);
031
}elseif($fp==FALSE){
032
return '- Invalid IP data file';
033
}
034
$length=$offset['len']-1028;
035
$start =@unpack('Vlen',$index[$ipdot[0]*4].$index[$ipdot[0]*4+1].$index[$ipdot[0]*4+2].$index[$ipdot[0]*4+3]);
036
for ($start=$start['len']*8+1024;$start
037
if ($index{$start}.$index{$start+1}.$index{$start+2}.$index{$start+3}>=$ip){
038
$index_offset=@unpack('Vlen',$index{$start+4}.$index{$start+5}.$index{$start+6}."\x0");
039
$index_length=@unpack('Clen',$index{$start+7});
040
break;
041
}
042
}
043
@fseek($fp,$offset['len']+$index_offset['len']-1024);
044
if($index_length['len']){
045
return '- '.@fread($fp,$index_length['len']);
046
}else{
047
return '- Unknown';
048
}
049
}
050
function convertip_full($ip,$ipdatafile){
051
if(!$fd=@fopen($ipdatafile,'rb')){
052
return '- Invalid IP data file';
053
}
054
$ip=explode('.',$ip);
055
$ipNum=$ip[0]*16777216+$ip[1]*65536+$ip[2]*256+$ip[3];
056
if(!($DataBegin=fread($fd,4))||!($DataEnd=fread($fd,4))) return;
057
@$ipbegin=implode('',unpack('L',$DataBegin));
058
if($ipbegin<0) $ipbegin+=pow(2,32);
059
@$ipend=implode('',unpack('L',$DataEnd));
060
if($ipend<0) $ipend+=pow(2,32);
061
$ipAllNum=($ipend-$ipbegin)/7+1;
062
$BeginNum=$ip2num=$ip1num=0;
063
$ipAddr1=$ipAddr2='';
064
$EndNum=$ipAllNum;
065
while($ip1num>$ipNum||$ip2num
066
$Middle= intval(($EndNum+$BeginNum)/2);
067
fseek($fd,$ipbegin+7*$Middle);
068
$ipData1=fread($fd,4);
069
if(strlen($ipData1)<4){
070
fclose($fd);
071
return '- System Error';
072
}
073
$ip1num=implode('',unpack('L',$ipData1));
074
if($ip1num<0) $ip1num+=pow(2,32);
075
if($ip1num>$ipNum){
076
$EndNum=$Middle;
077
continue;
078
}
079
$DataSeek=fread($fd,3);
080
if(strlen($DataSeek)<3){
081
fclose($fd);
082
return '- System Error';
083
}
084
$DataSeek=implode('',unpack('L',$DataSeek.chr(0)));
085
fseek($fd,$DataSeek);
086
$ipData2=fread($fd,4);
087
if(strlen($ipData2)<4){
088
fclose($fd);
089
return '- System Error';
090
}
091
$ip2num=implode('',unpack('L',$ipData2));
092
if($ip2num<0) $ip2num+=pow(2,32);
093
if($ip2num
094
if($Middle==$BeginNum){
095
fclose($fd);
096
return '- Unknown';
097
}
098
$BeginNum=$Middle;
099
}
100
}
101
$ipFlag=fread($fd,1);
102
if($ipFlag==chr(1)){
103
$ipSeek=fread($fd,3);
104
if(strlen($ipSeek)<3){
105
fclose($fd);
106
return '- System Error';
107
}
108
$ipSeek=implode('',unpack('L',$ipSeek.chr(0)));
109
fseek($fd,$ipSeek);
110
$ipFlag=fread($fd,1);
111
}
112
if($ipFlag==chr(2)){
113
$AddrSeek=fread($fd,3);
114
if(strlen($AddrSeek)<3){
115
fclose($fd);
116
return '- System Error';
117
}
118
$ipFlag=fread($fd,1);
119
if($ipFlag==chr(2)){
120
$AddrSeek2=fread($fd,3);
121
if(strlen($AddrSeek2)<3){
122
fclose($fd);
123
return '- System Error';
124
}
125
$AddrSeek2=implode('',unpack('L',$AddrSeek2.chr(0)));
126
fseek($fd,$AddrSeek2);
127
}else{
128
fseek($fd,-1,SEEK_CUR);
129
}
130
while(($char=fread($fd,1)) != chr(0))
131
$ipAddr2 .= $char;
132
$AddrSeek=implode('',unpack('L',$AddrSeek.chr(0)));
133
fseek($fd,$AddrSeek);
134
while(($char=fread($fd,1)) != chr(0))
135
$ipAddr1 .= $char;
136
}else{
137
fseek($fd,-1,SEEK_CUR);
138
while(($char=fread($fd,1)) != chr(0))
139
$ipAddr1 .= $char;
140
$ipFlag=fread($fd,1);
141
if($ipFlag==chr(2)){
142
$AddrSeek2=fread($fd,3);
143
if(strlen($AddrSeek2)<3){
144
fclose($fd);
145
return '- System Error';
146
}
147
$AddrSeek2=implode('',unpack('L',$AddrSeek2.chr(0)));
148
fseek($fd,$AddrSeek2);
149
}else{
150
fseek($fd,-1,SEEK_CUR);
151
}
152
while(($char=fread($fd,1)) != chr(0))
153
$ipAddr2 .= $char;
154
}
155
fclose($fd);
156
if(preg_match('/http/i',$ipAddr2)){
157
$ipAddr2='';
158
}
159
$ipaddr="$ipAddr1 $ipAddr2";
160
$ipaddr=preg_replace('/CZ88\.NET/is','',$ipaddr);
161
$ipaddr=preg_replace('/^\s*/is','',$ipaddr);
162
$ipaddr=preg_replace('/\s*$/is','',$ipaddr);
163
if(preg_match('/http/i',$ipaddr)||$ipaddr==''){
164
$ipaddr='- Unknown';
165
}
166
return '- '.$ipaddr;
167
}