php将IP地址转换为真实地址的方法
- 方法使用示例如下
define('WEB_ROOT',dirname(__FILE__));
echo convertip('111.63.244.69','full'); - func convertip
function convertip($ip,$integrity='simple'){ $return=''; $integrity=in_array($integrity,array('simple','full'))?$integrity:'simple'; if(preg_match("/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/",$ip)){ $iparray=explode('.',$ip); if($iparray[0]==10||$iparray[0]==127||($iparray[0]==192&&$iparray[1]==168)||($iparray[0]==172&&($iparray[1]>=16&&$iparray[1]<=31))){ $return = '- LAN'; }elseif($iparray[0]>255||$iparray[1]>255||$iparray[2]>255||$iparray[3]>255){ $return='- Invalid IP Address'; }else{ $tinyipfile=WEB_ROOT.'./tinyipdata.dat';//IP==地址数据包精简版 $fullipfile=WEB_ROOT.'./wry.dat';//IP==地址数据包完整版 if($integrity=='simple'&&@file_exists($tinyipfile)){ $return=convertip_tiny($ip,$tinyipfile); }elseif(@file_exists($fullipfile)){ $return=convertip_full($ip,$fullipfile); }
}
} return $return;
}
func convertip_tiny
function convertip_tiny($ip,$ipdatafile){
static $fp=NULL,$offset=array(),$index=NULL;
$ipdot=explode('.',$ip);
$ip=pack('N',ip2long($ip));
$ipdot[0]=(int)$ipdot[0];
$ipdot[1]=(int)$ipdot[1];
if($fp===NULL&&$fp=@fopen($ipdatafile,'rb')){
$offset=@unpack('Nlen',@fread($fp,4));
$index=@fread($fp,$offset['len']-4);
}elseif($fp==FALSE){
return '- Invalid IP data file';
}
$length=$offset['len']-1028;
$start =@unpack('Vlen',$index[$ipdot[0]*4].$index[$ipdot[0]*4+1].$index[$ipdot[0]*4+2].$index[$ipdot[0]*4+3]);
for ($start=$start['len']*8+1024;$start<$length;$start+=8){
if ($index{$start}.$index{$start+1}.$index{$start+2}.$index{$start+3}>=$ip){
$index_offset=@unpack('Vlen',$index{$start+4}.$index{$start+5}.$index{$start+6}."\x0");
$index_length=@unpack('Clen',$index{$start+7});
break;
}
}
@fseek($fp,$offset['len']+$index_offset['len']-1024);
if($index_length['len']){
return '- '.@fread($fp,$index_length['len']);
}else{
return '- Unknown';
}
}
- func convertip_full
function convertip_full($ip,$ipdatafile){ if(!$fd=@fopen($ipdatafile,'rb')){ return '- Invalid IP data file'; } $ip=explode('.',$ip); $ipNum=$ip[0]*16777216+$ip[1]*65536+$ip[2]*256+$ip[3]; if(!($DataBegin=fread($fd,4))||!($DataEnd=fread($fd,4))) return; @$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=$ip2num=$ip1num=0; $ipAddr1=$ipAddr2=''; $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 '- System Error'; } $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 '- 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); 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 '- 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; }
php将IP地址转换为真实地址的方法的更多相关文章
- ip地址转换
通常,我们用点分十进制字符串表示ipv4地址(192.168.1.1),用十六进制字符串表示ipv6地址(fe80::20c:29ff:fee9:4bcc). ipv4转换函数 #include &l ...
- [转]字符型IP地址转换成数字IP的SQL函数
使用SQL函数可以实现许多的功能,下面为您介绍的是字符型IP地址转换成数字IP的SQL函数示例,供您参考,希望对您学习SQL函数能够有所帮助. /**//*--调用示例 sele ...
- 华为上机:IP地址转换
IP地址转换 描述: IP地址的长度为32,即有2^32-1个地址.IP地址一般采用点分十进制表示法,例如"192.168.1.1".IP地址也可以直接用一个32位的整数进行表示. ...
- IP地址转换成Long型数字的算法
在应用程序开发中,涉及到IP地址的存储,大部分开发人员都将其存为String(或文本类型).能否将固定格式为m.n.x.y的IP地址转换成 Long型的数字呢?答案是肯定的.在数据库层面,可以直接将结 ...
- 四、IP地址转换
IP地址与端口 TCP/IP(传输控制协议/网际协议)不是一个协议,而是一组协议的总称,包括IP.TCP.UDP.ICMP.ARP等.它规范了网络上的所有通信设备,尤其是一个主机与另一个主机之间的数据 ...
- 字符串-06. IP地址转换
/* * Main.c * D6-字符串-06. IP地址转换 * Created on: 2014年8月19日 *******测试通过******** *转载:http://blog.csdn.ne ...
- 套接字编程相关函数(1:套接字地址结构、字节序转换、IP地址转换)
1. 套接字地址结构 1.1 IPv4套接字地址结构 IPv4套接字地址结构通常也称为“网际套接字地址结构”,它以sockaddr_in命名,定义在<netinet/in.h>头文件中.下 ...
- python整数与IP地址转换
python整数与IP地址转换 [转] 我们有时会将一个整数与IP地址进行互换,用python代码实现很简单将一个整数如2000000,变为一个IP地址的方式 >>> import ...
- IP地址转换函数
只适用于IPV4 inet_addr函数将用点分十进制字符串表示的IPv4地址转化为用网络字节序整数表示的IPv4地址. 失败时返回INADDR_NONE. inet_aton函数完成和inet_ad ...
随机推荐
- 后端程序员之路 23、一个c++的api framework
在"21.一个cgi的c++封装"中,我们封装了cgi,在这之上,我们可以再来封装一个webapi的framework.当然,前文的Casablanca是个不错的选择,但是它比较庞 ...
- Java 读取Word文本框中的文本/图片/表格
Word可插入文本框,文本框中可嵌入文本.图片.表格等内容.对文档中的已有文本框,也可以读取其中的内容.本文以Java程序代码来展示如何读取文本框,包括读取文本框中的文本.图片以及表格等. [程序环境 ...
- java 给时间增加时间得到一个新的时间(日期)
SimpleDateFormat df=new SimpleDateFormat("yyyy-MM-dd") LocalDate expirationDate String exp ...
- vue 实现页面嵌套pdf之vue-pdf插件
近期vue移动端项目中遇到了页面内,嵌套展示pdf内容.实现方法很多种,可以用iframe嵌套,但不利于引擎优化seo.所以在网上找到了vue-pdf这个插件,这个插件非常好用,其中封装的方法也很多, ...
- 混合编程:如何用python11调用C++
摘要:在实际开发过程中,免不了涉及到混合编程,比如,对于python这种脚本语言,性能还是有限的,在一些对性能要求高的情景下面,还是需要使用c/c++来完成. 那怎样做呢?我们能使用pybind11作 ...
- 使用Webpack构建多页面程序
使用webpack搭建单页面程序十分常见,但在实际开发中我们可能还会有开发多页面程序的需求,因此我研究了一下如何使用webpack搭建多页面程序. 原理 将每个页面所在的文件夹都看作是一个单独的单页面 ...
- Srping源码之XMLBeanFactory
本文是针对Srping的XMLBeanFactory来进行解析xml并将解析后的信息使用GenericBeanDefinition作为载体进行注册,xmlBeanFactory已经在Spring ...
- PTA 线性表元素的区间删除
6-8 线性表元素的区间删除 (20 分) 给定一个顺序存储的线性表,请设计一个函数删除所有值大于min而且小于max的元素.删除后表中剩余元素保持顺序存储,并且相对位置不能改变. 函数接口定义: ...
- 3、MyBatis教程之CURD操作
4.CURD操作 1.查询 根据用户 Id查询用户 在UserMapper中添加对应方法 public interface UserMapper { List<User> getUserL ...
- OpenGL 绘制你的 github skyline 模型
前言 好久没更新博客了,上一篇文章还是在去年6月份,乍一看居然快要过去一年了,不时还能看到粉丝数和排名在涨,可是却一直没有内容更新,怪不好意思的- -(主要是一直没想好要写些什么,中间也有过一些想法, ...