解析纯真ip数据库php源码, 纯真数据库IP地理位置查询类

/*
IP 地理位置查询类
$ip = new ip();
$addr = $ip->ip2addr('125.70.28.14');
p($addr);
*/
class ip
{var $fh; //IP数据库文件句柄var $first; //第一条索引var $last; //最后一条索引var $total; //索引总数//构造函数function __construct($filename='../db/qqwry.dat'){$this->fh = fopen($filename, 'rb'); //qqwry.dat文件$this->first = $this->getLong4();$this->last = $this->getLong4();$this->total = ($this->last - $this->first) / 7; //每条索引7字节}//检查IP合法性function checkIp($ip){$arr = explode('.', $ip);if (count($arr) != 4) {return false;} else {for ($i = 0; $i < 4; $i++) {if ($arr[$i] > 255) {return false;}}}return true;}function getLong4(){//读取little-endian编码的4个字节转化为长整型数$result = unpack('Vlong', fread($this->fh, 4));return $result['long'];}function getLong3(){//读取little-endian编码的3个字节转化为长整型数$result = unpack('Vlong', fread($this->fh, 3) . chr(0));return $result['long'];}//查询信息function getInfo($data = ""){$char = fread($this->fh, 1);while (ord($char) != 0) { //国家地区信息以0结束$data .= $char;$char = fread($this->fh, 1);}return $data;}//查询地区信息function getArea(){$byte = fread($this->fh, 1); //标志字节switch (ord($byte)) {case 0:$area = '';break; //没有地区信息case 1: //地区被重定向fseek($this->fh, $this->getLong3());$area = $this->getInfo();break;case 2: //地区被重定向fseek($this->fh, $this->getLong3());$area = $this->getInfo();break;default:$area = $this->getInfo($byte);break; //地区没有被重定向}return $area;}function ip2addr($ip){if (!$this->checkIp($ip)) {return false;}$ip = pack('N', intval(ip2long($ip)));
//二分查找$l = 0;$r = $this->total;while ($l <= $r) {$m = floor(($l + $r) / 2); //计算中间索引fseek($this->fh, $this->first + $m * 7);$beginip = strrev(fread($this->fh, 4)); //中间索引的开始IP地址fseek($this->fh, $this->getLong3());$endip = strrev(fread($this->fh, 4)); //中间索引的结束IP地址if ($ip < $beginip) { //用户的IP小于中间索引的开始IP地址时$r = $m - 1;} else {if ($ip > $endip) { //用户的IP大于中间索引的结束IP地址时$l = $m + 1;} else { //用户IP在中间索引的IP范围内时$findip = $this->first + $m * 7;break;}}}
//查询国家地区信息fseek($this->fh, $findip);$location['beginip'] = long2ip($this->getLong4()); //用户IP所在范围的开始地址$offset = $this->getlong3();fseek($this->fh, $offset);$location['endip'] = long2ip($this->getLong4()); //用户IP所在范围的结束地址$byte = fread($this->fh, 1); //标志字节switch (ord($byte)) {case 1: //国家和区域信息都被重定向$countryOffset = $this->getLong3(); //重定向地址fseek($this->fh, $countryOffset);$byte = fread($this->fh, 1); //标志字节switch (ord($byte)) {case 2: //国家信息被二次重定向fseek($this->fh, $this->getLong3());$location['country'] = $this->getInfo();fseek($this->fh, $countryOffset + 4);$location['area'] = $this->getArea();break;default: //国家信息没有被二次重定向$location['country'] = $this->getInfo($byte);$location['area'] = $this->getArea();break;}break;case 2: //国家信息被重定向fseek($this->fh, $this->getLong3());$location['country'] = $this->getInfo();fseek($this->fh, $offset + 8);$location['area'] = $this->getArea();break;default: //国家信息没有被重定向$location['country'] = $this->getInfo($byte);$location['area'] = $this->getArea();break;}
//gb2312 to utf-8(去除无信息时显示的CZ88.NET)foreach ($location as $k => $v) {$location[$k] = str_replace('CZ88.NET', '', iconv('gb2312', 'utf-8', $v));}return $location;}
//析构函数function __destruct(){fclose($this->fh);}
}

解析纯真ip数据库php源码, 纯真数据库IP地理位置查询类相关推荐

  1. 实例源码_SpringBoot数据库源码解析Template实例化操作

    Jdbc TemplateAutoConfiguration 在实践过程中,除了数据源的配置外,我们还会经常用到 Jdbc Template.Jdbc Template是 Spring 对数据库的操作 ...

  2. 基于Python的旅游管理系统微信小程序设计与实现毕业论文+项目源码及数据库

     源码获取:我的博客资源页面可以下载!!!! 项目名称 基于Python的旅游管理系统微信小程序设计与实现毕业论文+项目源码及数据库 系统说明 本商业旅游系统可以分为三个部分,即微信小程序的手机客户端 ...

  3. 资源采集网php源码,YK影视聚合资源采集无需数据库PHP源码V2.3-完全开源

    源码无需数据库,直接上传即可访问,支持上传二级目录访问 采集资源网对接的接口通用为CMS苹果接口 免费空间(康乐推荐PHP5.6)使用教程如下----不要问哪里有我们论坛有 一,将压缩包传到  WWW ...

  4. (免费分享)基于JavaWeb的高校试题库管理系统设计与实现 毕业论文+项目源码及数据库文件(已发)

     源码获取:我的博客资源页面可以下载!!!! 项目名称 (免费分享)基于JavaWeb的高校试题库管理系统设计与实现 毕业论文+项目源码及数据库文件(已发) 系统说明 随着信息技术的不断发展,我们已经 ...

  5. 网站访客系统php,2套网站访客IP黑名单源码有效屏蔽ip(PHP实现,CC防火墙)

    网站IP黑名单2组源代码可有效阻止ip(在PHP中实现,可以用作CC防火墙),一组是单页banIP版本(支持PHP5.4或更高版本,未选择服务器环境)  ,系统未选中) 一组是整个站点的banIP版本 ...

  6. Android事件分发机制完全解析,带你从源码的角度彻底理解(上)

    <div id="container">         <div id="header">     <div class=&qu ...

  7. 基于SSH的通讯网络电子计费系统 毕业论文+任务书+开题报告+文献综述+外文翻译及原文+答辩PPT+代码清单+项目源码及数据库文件

    下载地址:https://download.csdn.net/download/junkyio321/40671271 项目介绍: 基于SSH的通讯网络电子计费系统 毕业论文+任务书+开题报告+文献综 ...

  8. 【转】Android事件分发机制完全解析,带你从源码的角度彻底理解(下)

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/9153761 记得在前面的文章中,我带大家一起从源码的角度分析了Android中Vi ...

  9. 要的需求 ip提取网站源码带采集 要求是PHP源码

    求.ip提取网站源码带采集 要求是PHP源码.必须带采集 类似 小峰IP提取网站,安小莫IP提取,迷惘IP提取,冰封IP提取 免费类型的 不要淘宝类型的 200 转载于:https://www.cnb ...

  10. [学习总结]7、Android AsyncTask完全解析,带你从源码的角度彻底理解

    我们都知道,Android UI是线程不安全的,如果想要在子线程里进行UI操作,就需要借助Android的异步消息处理机制.之前我也写过了一篇文章从源码层面分析了Android的异步消息处理机制,感兴 ...

最新文章

  1. vector简单实现
  2. Django models模型
  3. 决策树——排序算法的理论下界
  4. php 抽象类 静态 单体设计模式
  5. zabbix使用ICMP ping监控网络状态
  6. 吴恩达神经网络和深度学习-学习笔记-4-深度网络
  7. CentOS 7 + Win 双系统的安装遇到的重要问题
  8. java中printreader类_java字符流,字符文件输入流FileReader类介绍
  9. sd u盘 速度测试软件,u盘速度测试(FlashBench)sd卡速度测试
  10. RGB颜色与十六进制颜色码
  11. Java 简单计算器
  12. win10怎么取消小箭头_已取消到该网页的导航,小编教你网页提示已取消到该网页的导航怎么办...
  13. mongodb 使用$lookup做多表关联处理
  14. 流利阅读12.28 Seriously, Prada, what were you thinking? Why the fashion industry keeps bumbling into rac
  15. K8S kube-proxy- iptable模式实现原理分析
  16. 阚俊青少机器人_长春中医药大学附属医院、中医学院阚俊明副书记一行调研我校中医学类学生培养工作...
  17. 给大家推荐一款超低功耗的4G低功耗摄像头方案强大的AI功能
  18. 唯有卡拉特拉瓦,才敢让建筑飞起来!
  19. C/C++动态申请空间方式
  20. 软件测试性能工程师工资,软件测试工程师工资一般多少 前景怎么样

热门文章

  1. I2S/PCM协议及TDM模式详解
  2. Linux中Tomcat的安装及配置
  3. linux 共享文件夹 权限
  4. Pyspider 框架的用法
  5. mysql学生管理系统毕业设计_学生成绩管理系统设计与实现(MySQL)
  6. Qt下汉字转拼音,包含二级汉字
  7. 香农编码(C语言实现香农编码,并计算信源熵、平均码长、编码效率)
  8. pandownload最新复活版登录失败_神途手游万能登录器app-神途手游万能登录器app最新手机版下载v1.0...
  9. 高效实用Chrome浏览器,这份Top 20插件榜对你肯定有帮助
  10. ROS安装教程(ubuntu20.04安装ROS Noetic Ninjemys)