如下所示:

$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)相关推荐

  1. 钉钉授权时报获取钉钉用户信息失败,失败原因:访问ip不在白名单之中的解决办法

    前言 公司里的一个钉钉h5应用项目,进入里需要钉钉授权,提示:钉钉授权时报获取钉钉用户信息失败,失败原因:访问ip不在白名单之中的解决办法,这个错误有一段时间了,后来在官方的文档里找到解决方法 钉钉官 ...

  2. 获取java异常堆栈信息_Java 实例 - 获取异常的堆栈信息

    全屏 Java 实例 - 获取异常的堆栈信息 以下实例演示了使用异常类的 printStack() 方法来获取堆栈信息: Main.java 文件public class Main{ public s ...

  3. Linux下显示IP地址所在地信息的小工具——nali

    项目谷歌地址:https://code.google.com/p/qqwry/ 一.nali简介 nali,名字取自中文"哪里"的拼音.nali包含一组命令行程序,其主要功能就是把 ...

  4. c 获取当前时间插入oracle数据库,Oracle如何获取系统当前时间等操作实例,c++获取系统时间...

    Oracle如何获取系统当前时间等操作实例,c++获取系统时间 获取系统当前时间 date类型的 select sysdate from dual; char类型的 select to_char(sy ...

  5. python ipaddr库_用Python脚本查询纯真IP库QQWry.dat(Demon修改版)

    #!/usr/bin/env python # coding: utf-8 # from: http://linuxtoy.org/files/pyip.py # Blog: http://linux ...

  6. JAVA程序 通过IP地址 获取MAC地址

    转载自:https://blog.csdn.net/chwshuang/article/details/46958719 叙述 我们都知道通过在电脑上敲 cmd 后,输入ipconfig -all 来 ...

  7. QQWry.dat文件结构分析(zz)

    TITLE  : QQWry.dat文件结构分析 AUTHOR : lionel@nkbbs.org DATE   : 2004/12/18 CONTENT:          最近写一个程序,其中一 ...

  8. jsp如果显示服务器地址,jsp获取服务器地址

    jsp获取服务器地址 内容精选 换一换 客户端IP指的是访问者(用户设备)的IP地址.在Web应用开发中,通常需要获取客户端真实的IP地址.例如,投票系统为了防止刷票,需要通过获取客户端真实IP地址, ...

  9. Java 网络实例三(获取URL响应头的日期信息、获取URL响应头信息、解析URL、ServerSocket和Socket通信实例)

    获取 URL响应头的日期信息 以下实例演示了如何使用 HttpURLConnection 的 httpCon.getDate() 方法来获取 URL响应头的日期信息: import java.net. ...

  10. 计算机毕业设计SSM本科培训班学员信息管理系统【附源码数据库】

    项目运行 环境配置: Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(IntelliJ IDEA,Eclispe,MyEclis ...

最新文章

  1. python:json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes问题解决
  2. [转] 用Firebug调试JavaScript
  3. TCP 、UDP各自的优缺点
  4. Maven 中的pom.xml文件
  5. python语音识别的第三方库_python标准库+内置函数+第三方库: 7.音频处理
  6. 背不下《道德经》,至少背下这10句精华!
  7. Expression Blend实战开发技巧 第四章 从最常用ButtonStyle开始 - PathButton
  8. C语言头文件一般以什么名称结尾,c语言书写规范.doc
  9. 重拾web开发-DIV+CSS基础(总结)
  10. the 1st one
  11. 员工说不用兼容老文件,当主管的就信了?
  12. 【latex】2 使用Aurora与在word中编写伪代码
  13. 【Java基础知识 17】聊一聊同步代码块
  14. 微信小程序中,数字等宽字体
  15. python 天勤 金叉 编程代码_GitHub - Oscar201106/tqsdk-python: 天勤量化开发包, 期货量化, 实时行情/历史数据/实盘交易...
  16. 力扣(718.1143)补9.12
  17. 软件工程课程周进度报告 第六周
  18. 小学音乐课需要用到的关于《勤快人与懒惰人》的-五线谱
  19. c#控件listview
  20. 如何在 SAP ABAP 系统中使用 Adobe Form 试读版

热门文章

  1. 2022年低压电工考试题及在线模拟考试
  2. 在Unity中使用.Net Remoting实现双向通信
  3. 课堂笔记-爬虫beautifulsoup模块
  4. JAVA在线看CAD图纸快速入门
  5. mysql rds 迁移_如何实现迁移RDS for MySQL数据到本地 MySQL
  6. CREO:CREO软件之零件【造型】样式栏之操作、平面、曲线、曲面、分析、优先选项的简介及其使用方法(图文教程)之详细攻略
  7. curl的安装与配置
  8. ActiveMQ 下载与安装
  9. Ubuntu配置显卡驱动
  10. TOPSIS(理想解法)