get查询IP PHP源码,ip归属地查询代码
ip归属地
IP地址查询
//ipcheck.class.php代码如下
class IpLocation {
/**
* QQWry.Dat文件指针
* @var resource
*/
var $fp;
/**
* 第一条IP记录的偏移地址
*
* @var int
*/
var $firstip;
/**
* 最后一条IP记录的偏移地址
*
* @var int
*/
var $lastip;
/**
* IP记录的总条数(不包含版本信息记录)
*
* @var int
*/
var $totalip;
/**
* 返回读取的长整型数
*
* @access private
* @return int
*/
function getlong() {
//将读取的little-endian编码的4个字节转化为长整型数
$result = unpack('Vlong', fread($this->fp, 4));
return $result['long'];
}
/**
* 返回读取的3个字节的长整型数
*
* @access private
* @return int
*/
function getlong3() {
//将读取的little-endian编码的3个字节转化为长整型数
$result = unpack('Vlong', fread($this->fp, 3).chr(0));
return $result['long'];
}
/**
* 返回压缩后可进行比较的IP地址
*
* @access private
* @param string $ip
* @return string
*/
function packip($ip) {
// 将IP地址转化为长整型数,如果在PHP5中,IP地址错误,则返回False,
// 这时intval将Flase转化为整数-1,之后压缩成big-endian编码的字符串
return pack('N', intval(ip2long($ip)));
}
/**
* 返回读取的字符串
*
* @access private
* @param string $data
* @return string
*/
function getstring($data = "") {
$char = fread($this->fp, 1);
while (ord($char) > 0) { // 字符串按照C格式保存,以结束
$data .= $char; // 将读取的字符连接到给定字符串之后
$char = fread($this->fp, 1);
}
return $data;
}
/**
* 返回地区信息
*
* @access private
* @return string
*/
function getarea() {
$byte = fread($this->fp, 1); // 标志字节
switch (ord($byte)) {
case 0: // 没有区域信息
$area = "";
break;
case 1:
case 2: // 标志字节为1或2,表示区域信息被重定向
fseek($this->fp, $this->getlong3());
$area = $this->getstring();
break;
default: // 否则,表示区域信息没有被重定向
$area = $this->getstring($byte);
break;
}
return $area;
}
/**
* 根据所给 IP 地址或域名返回所在地区信息
*
* @access public
* @param string $ip
* @return array
*/
function getlocation($ip) {
if (!$this->fp) return null; // 如果数据文件没有被正确打开,则直接返回空
$location['ip'] = gethostbyname($ip); // 将输入的域名转化为IP地址
$ip = $this->packip($location['ip']); // 将输入的IP地址转化为可比较的IP地址
// 不合法的IP地址会被转化为255.255.255.255
// 对分搜索
$l = 0; // 搜索的下边界
$u = $this->totalip; // 搜索的上边界
$findip = $this->lastip; // 如果没有找到就返回最后一条IP记录(QQWry.Dat的版本信息)
while ($l <= $u) { // 当上边界小于下边界时,查找失败
$i = floor(($l + $u) / 2); // 计算近似中间记录
fseek($this->fp, $this->firstip + $i * 7);
$beginip = strrev(fread($this->fp, 4)); // 获取中间记录的开始IP地址
// strrev函数在这里的作用是将little-endian的压缩IP地址转化为big-endian的格式
// 以便用于比较,后面相同。
if ($ip < $beginip) { // 用户的IP小于中间记录的开始IP地址时
$u = $i - 1; // 将搜索的上边界修改为中间记录减一
}
else {
fseek($this->fp, $this->getlong3());
$endip = strrev(fread($this->fp, 4)); // 获取中间记录的结束IP地址
if ($ip > $endip) { // 用户的IP大于中间记录的结束IP地址时
$l = $i + 1; // 将搜索的下边界修改为中间记录加一
}
else { // 用户的IP在中间记录的IP范围内时
$findip = $this->firstip + $i * 7;
break; // 则表示找到结果,退出循环
}
}
}
//获取查找到的IP地理位置信息
fseek($this->fp, $findip);
$location['beginip'] = long2ip($this->getlong()); // 用户IP所在范围的开始地址
$offset = $this->getlong3();
fseek($this->fp, $offset);
$location['endip'] = long2ip($this->getlong()); // 用户IP所在范围的结束地址
$byte = fread($this->fp, 1); // 标志字节
switch (ord($byte)) {
case 1: // 标志字节为1,表示国家和区域信息都被同时重定向
$countryOffset = $this->getlong3(); // 重定向地址
fseek($this->fp, $countryOffset);
$byte = fread($this->fp, 1); // 标志字节
switch (ord($byte)) {
case 2: // 标志字节为2,表示国家信息又被重定向
fseek($this->fp, $this->getlong3());
$location['country'] = $this->getstring();
fseek($this->fp, $countryOffset + 4);
$location['area'] = $this->getarea();
break;
default: // 否则,表示国家信息没有被重定向
$location['country'] = $this->getstring($byte);
$location['area'] = $this->getarea();
break;
}
break;
case 2: // 标志字节为2,表示国家信息被重定向
fseek($this->fp, $this->getlong3());
$location['country'] = $this->getstring();
fseek($this->fp, $offset + 8);
$location['area'] = $this->getarea();
break;
default: // 否则,表示国家信息没有被重定向
$location['country'] = $this->getstring($byte);
$location['area'] = $this->getarea();
break;
}
if ($location['country'] == " CZ88.NET") { // CZ88.NET表示没有有效信息
$location['country'] = "未知";
}
if ($location['area'] == " CZ88.NET") {
$location['area'] = "";
}
//return $location;
echo "你的IP:".$location['ip']."
来自".$location['country'].$location['area'];
}
/**
* 构造函数,打开 QQWry.Dat 文件并初始化类中的信息
*
* @param string $filename
* @return IpLocation
*/
function IpLocation($filename = "QQWry.Dat") {
if (($this->fp = @fopen($filename, 'rb')) !== false) {
$this->firstip = $this->getlong();
$this->lastip = $this->getlong();
$this->totalip = ($this->lastip - $this->firstip) / 7;
//注册析构函数,使其在程序执行结束时执行
register_shutdown_function(array(&$this, '_IpLocation'));
}
}
/**
* 析构函数,用于在页面执行结束后自动关闭打开的文件。
*
*/
function _IpLocation() {
fclose($this->fp);
}
}
?>
本文原创发布php中文网,转载请注明出处,感谢您的尊重!
get查询IP PHP源码,ip归属地查询代码相关推荐
- C# 自动投票和手机号码归属地查询 - 简单程序源码分享(高手飘过)
C# 自动投票和手机号码归属地查询 - 简单程序源码分享(高手飘过) C# 自动投票和手机号码归属地查询 - 简单程序源码分享(高手飘过) 如有转载,请注明出处: http://www.cnblogs ...
- 两款网页在线刷网站访客pv和ip的源码
简介: 网页在线刷pv和ip的源码,可以刷网页浏览量 空间类型iis/asp 虚拟主机或者服务器即可 非常简单,上传就可以使用,跟cc是一个原理,仅供参考 网盘下载地址: http://www.byt ...
- 网站访客系统php,2套网站访客IP黑名单源码有效屏蔽ip(PHP实现,CC防火墙)
网站IP黑名单2组源代码可有效阻止ip(在PHP中实现,可以用作CC防火墙),一组是单页banIP版本(支持PHP5.4或更高版本,未选择服务器环境) ,系统未选中) 一组是整个站点的banIP版本 ...
- JAVA毕业设计公交线路查询系统计算机源码+lw文档+系统+调试部署+数据库
JAVA毕业设计公交线路查询系统计算机源码+lw文档+系统+调试部署+数据库 JAVA毕业设计公交线路查询系统计算机源码+lw文档+系统+调试部署+数据库 本源码技术栈: 项目架构:B/S架构 开发语 ...
- 王者荣耀战力查询小程序源码下载-支持安卓ios微信和QQ战力查询支持打包成APP
王者荣耀战力查询小程序源码下载-支持安卓ios微信和QQ战力查询支持打包成APP 该源码没有后台的也无需后台的,所以也就没有什么服务器和域名的烦恼和费用了 使用方法用HBuilder X软件打开文件然 ...
- 【小程序源码】同名在线查询系统
这是一款支持查询同名的一款微信小程序 该款小程序支持多种查询模式 重名查询,热度查询,概率查询 有点不好的就是该款小程序的接口好像带了个二维码因为在接口上面所以去不掉 如果不介意的话这款小程序还是很好 ...
- 小程序源码:未来老婆查询生成器-多玩法安装简单
这是一款未来老婆或女朋友查询生成器 玩法也就相当于类似之前很火的一款重生模拟器一样 通过自己的选项来鉴定出未来老婆 PS:只是娱乐别认真哈 另外这款小程序还有支持跳转其它小程序界面 另外还支持流量主模 ...
- Mybatis源码分析--关联表查询及延迟加载原理(二)
在上一篇博客Mybatis源码分析--关联表查询及延迟加载(一)中我们简单介绍了Mybatis的延迟加载的编程,接下来我们通过分析源码来分析一下Mybatis延迟加载的实现原理. 其实简单来说Myba ...
- 查分吧(chafenba)万用考试成绩查询小程序源码
查分吧(chafenba)万用考试成绩查询小程序源码 小程序演示:查分吧 小程序源码:http://mabida.cn/chafenba.zip 可以快速应用于保密性不高且修改不频繁的成绩.工资.证书 ...
- 最新防伪和代{过}{滤}理授权查询系统网站源码V1.3
正文: 防伪和代过滤理授权查询系统网站源码 (一) 建议运行环境需求:PHP5.1+MYSQL5.0以上组合 (二) 安装步骤: (1) Linux 或 Freebsd 服务器下安装方法. 第一步:使 ...
最新文章
- Python使用matplotlib函数subplot可视化多个不同颜色的折线图、使用set_major_formatter函数自定义设置y轴数值标签格式为百分比
- 计算机与广播电视论文,计算机技术在广播电视节目的应用论文
- 新一代Web的蓝图--语义web
- C# HttpWebRequest提交数据方式
- mysql 事务 注意 优化_MySQL入门详解——事务、锁、优化
- ROS中阶笔记(八):机器人SLAM与自主导航—机器人自主导航
- C3P0连接池问题,APPARENT DEADLOCK!!! Creating emergency..... [问题点数:20分,结帖人lovekong]...
- 初识ObjectBox--Android平台
- CloudSim源码分析之DatacenterBroker--processEvent()
- vivo手机要用计算机隐藏游戏图标,vivo手机怎么隐藏桌面应用图标
- 掌财社:10年财务造假 乐视网、贾跃亭等被11名投资者诉至法院!
- 引流产品分几类?引流产品结构四类定位产品
- 被误解的 Node.js
- 【Unity小游戏】 横版2D射击小游戏 效果展示+完整项目源码【超级简单,自己也可以做游戏玩了】
- 在u盘运行linux系统软件,主编帮你xp系统利用U盘直接运行Linux软件 的步骤【图】...
- 用pdfmake生成pdf中文文档
- 清华大学药学院丁胜团队在《自然》发表突破性全能干细胞创新研究
- 组织过程管理,项目管理过程
- 机器学习与深度学习——通过knn算法分类鸢尾花数据集iris求出错误率并进行可视化
- CSDN2011年重大IT安全事件回顾
热门文章
- Training data-efficient image transformers distillation through attention
- iOS 三国杀 Ver.LOG
- 【AC.HASH】OpenHarmony啃论文俱乐部——哈希技术:综述和分类(译)
- C语言课程设计小孩吃梨,IQ题
- 24道互联网大厂最爱问智商题汇总|你能答对几道?(附带答案、详解)
- 微x模块怎么导入主题_WESHOP | 基于微服务的小程序商城系统
- 基于机器学习的笑脸检测
- CSS3旋转按钮html,一款纯css3实现的翻转按钮_html/css_WEB-ITnose
- c语言 fflush stdin,C语言函数:fflush(stdin)
- Java浅拷贝和深拷贝