php中ip转换,php将IP地址转换为真实地址的方法

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

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值