php ip纯真数据库Dat,PHP获取IP地址所在地信息的实例(使用纯真IP数据库qqwry.dat)
如下所示:
$data = "254.254.254.254";
echo ip2long($data);
function getIP()
{
if(getenv("HTTP_CLIENT_IP") && strcasecmp(getenv("HTTP_CLIENT_IP"), "unknown"))
$ip = getenv("HTTP_CLIENT_IP");
elseif(getenv("HTTP_X_FORWARDED_FOR") && strcasecmp(getenv("HTTP_X_FORWARDED_FOR"), "unknown"))
$ip = getenv("HTTP_X_FORWARDED_FOR");
elseif (getenv("REMOTE_ADDR") && strcasecmp(getenv("REMOTE_ADDR"), "unknown"))
$ip = getenv("REMOTE_ADDR");
elseif (isset($_SERVER["REMOTE_ADDR"]) && $_SERVER["REMOTE_ADDR"] && strcasecmp($_SERVER["REMOTE_ADDR"], "unknown"))
$ip = $_SERVER["REMOTE_ADDR"];
else
$ip = "0.0.0.0";
return $ip;
}
class IpLocation {
//数据文件指针
var $fp;
var $firstip;
var $lastip;
var $totalip;
function getlong() {
//unpack从二进制字符串对数据进行解包
//将读取的little-endian编码的4个字节转化为长整型数,fread安全读取二进制文件
$result = unpack("Vlong", fread($this->fp, 4));
return $result["long"];
}
function getlong3() {
//将读取的little-endian编码的3个字节转化为长整型数
$result = unpack("Vlong", fread($this->fp, 3).chr(0));
return $result["long"];
}
function packip($ip) {
//pack把数据装入一个二进制字符串
//ip2long将IP地址转成无符号的长整型,也可以用来验证IP地址
return pack("N", intval(ip2long($ip)));
}
function getstring($data = "") {
$char = fread($this->fp, 1);
while (ord($char) > 0) { //ord返回字符的ASCII值,字符串按照C格式保存,以 结束
$data .= $char;
$char = fread($this->fp, 1);
}
return $data;
}
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;
}
function getlocation($ip) {
if (!$this->fp) return null; // 如果数据文件没有被正确打开,则直接返回空
$location["ip"] = gethostbyname($ip); // 域名转化为IP地址
$ip = $this->packip($location["ip"]); // 将输入的IP地址转化为可比较的IP地址
// 不合法的IP地址会被转化为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反转字符串
// strrev函数在这里的作用是将little-endian的压缩IP地址转化为big-endian的格式,便于比较
//关于little-endian与big-endian 参考:http://baike.baidu.com/view/2368412.htm
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; // 则表示找到结果,退出循环
}
}
}
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"] == " CZNET") { // CZNET表示没有有效信息
$location["country"] = "未知";
}
if ($location["area"] == " CZNET") {
$location["area"] = "";
}
return $location;
}
/**
* 构造函数,打开 QQWry.Dat 文件并初始化类中的信息
*/
function IpLocation($filename = "qqwry.dat") {
$this->fp = 0;
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() {
if ($this->fp) {
fclose($this->fp);
}
$this->fp = 0;
}
}
header("content-Type: text/html; charset=gbk");
$ipOrDomain="110.0.0.0";
//$ipOrDomain="www.baidu.com";
$iplocation = new IpLocation();
$location = $iplocation->getlocation($ipOrDomain);
$address=mb_convert_encoding($location["country"].$location["area"], "gbk", "gbk");
echo $address;
?>
以上这篇PHP获取IP地址所在地信息的实例(使用纯真IP数据库qqwry.dat)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持网页设计。
php ip纯真数据库Dat,PHP获取IP地址所在地信息的实例(使用纯真IP数据库qqwry.dat)相关推荐
- 钉钉授权时报获取钉钉用户信息失败,失败原因:访问ip不在白名单之中的解决办法
前言 公司里的一个钉钉h5应用项目,进入里需要钉钉授权,提示:钉钉授权时报获取钉钉用户信息失败,失败原因:访问ip不在白名单之中的解决办法,这个错误有一段时间了,后来在官方的文档里找到解决方法 钉钉官 ...
- 获取java异常堆栈信息_Java 实例 - 获取异常的堆栈信息
全屏 Java 实例 - 获取异常的堆栈信息 以下实例演示了使用异常类的 printStack() 方法来获取堆栈信息: Main.java 文件public class Main{ public s ...
- Linux下显示IP地址所在地信息的小工具——nali
项目谷歌地址:https://code.google.com/p/qqwry/ 一.nali简介 nali,名字取自中文"哪里"的拼音.nali包含一组命令行程序,其主要功能就是把 ...
- c 获取当前时间插入oracle数据库,Oracle如何获取系统当前时间等操作实例,c++获取系统时间...
Oracle如何获取系统当前时间等操作实例,c++获取系统时间 获取系统当前时间 date类型的 select sysdate from dual; char类型的 select to_char(sy ...
- python ipaddr库_用Python脚本查询纯真IP库QQWry.dat(Demon修改版)
#!/usr/bin/env python # coding: utf-8 # from: http://linuxtoy.org/files/pyip.py # Blog: http://linux ...
- JAVA程序 通过IP地址 获取MAC地址
转载自:https://blog.csdn.net/chwshuang/article/details/46958719 叙述 我们都知道通过在电脑上敲 cmd 后,输入ipconfig -all 来 ...
- QQWry.dat文件结构分析(zz)
TITLE : QQWry.dat文件结构分析 AUTHOR : lionel@nkbbs.org DATE : 2004/12/18 CONTENT: 最近写一个程序,其中一 ...
- jsp如果显示服务器地址,jsp获取服务器地址
jsp获取服务器地址 内容精选 换一换 客户端IP指的是访问者(用户设备)的IP地址.在Web应用开发中,通常需要获取客户端真实的IP地址.例如,投票系统为了防止刷票,需要通过获取客户端真实IP地址, ...
- Java 网络实例三(获取URL响应头的日期信息、获取URL响应头信息、解析URL、ServerSocket和Socket通信实例)
获取 URL响应头的日期信息 以下实例演示了如何使用 HttpURLConnection 的 httpCon.getDate() 方法来获取 URL响应头的日期信息: import java.net. ...
- 计算机毕业设计SSM本科培训班学员信息管理系统【附源码数据库】
项目运行 环境配置: Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(IntelliJ IDEA,Eclispe,MyEclis ...
最新文章
- python:json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes问题解决
- [转] 用Firebug调试JavaScript
- TCP 、UDP各自的优缺点
- Maven 中的pom.xml文件
- python语音识别的第三方库_python标准库+内置函数+第三方库: 7.音频处理
- 背不下《道德经》,至少背下这10句精华!
- Expression Blend实战开发技巧 第四章 从最常用ButtonStyle开始 - PathButton
- C语言头文件一般以什么名称结尾,c语言书写规范.doc
- 重拾web开发-DIV+CSS基础(总结)
- the 1st one
- 员工说不用兼容老文件,当主管的就信了?
- 【latex】2 使用Aurora与在word中编写伪代码
- 【Java基础知识 17】聊一聊同步代码块
- 微信小程序中,数字等宽字体
- python 天勤 金叉 编程代码_GitHub - Oscar201106/tqsdk-python: 天勤量化开发包, 期货量化, 实时行情/历史数据/实盘交易...
- 力扣(718.1143)补9.12
- 软件工程课程周进度报告 第六周
- 小学音乐课需要用到的关于《勤快人与懒惰人》的-五线谱
- c#控件listview
- 如何在 SAP ABAP 系统中使用 Adobe Form 试读版