通过ip获取地址

<?php

/**

* IP 地理位置查询类

*

* @author 马秉尧

* @version 1.5

* @copyright 2005 CoolCode.CN

*/

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格式保存,以\0结束

             $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;

     }

     /**

      * 构造函数,打开 QQWry.Dat 文件并初始化类中的信息

      *

      * @param string $filename

      * @return IpLocation

      */

     function IpLocation($filename =‘E:\php_project\test\thinkphp_3.2.2_full\ThinkPHP\Library\Org\Net\UTFWry.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;

     }

}

//test demo
$ip = "202.101.111.195";
$iplocation = new IpLocation();
$location = $iplocation->getlocation($ip);
print_r($location);
?>

UTFWry.dat地址:http://pan.baidu.com/s/1sjQAUcd

下载 UTFWry.dat 放到本地 路径替换  $filename =‘E:\php_project\test\thinkphp_3.2.2_full\ThinkPHP\Library\Org\Net\UTFWry.dat‘

时间: 2024-10-05 11:41:11

通过ip获取地址的相关文章

C#调用百度高精度IP定位API通过IP获取地址

API首页:http://lbsyun.baidu.com/index.php?title=webapi/high-acc-ip 1.申请百度账号,创建应用,获取密钥(AK) http://lbsyun.baidu.com/apiconsole/key 启用服务:,可以根据自己需求来钩选,这里先全选了. 请求校验方式:IP白名单校验/SN检验,这里选择IP白名单校验.即在下面填上你访问机器的IP地址.如(114.114.114.114). 单击提交,获得AK 2.获取方式: 服务地址: http

java 根据ip获取地址

用淘宝接口:(源码:java 根据IP地址获取地理位置) pom.xml: <!-- https://mvnrepository.com/artifact/net.sourceforge.jregex/jregex --> <dependency> <groupId>net.sourceforge.jregex</groupId> <artifactId>jregex</artifactId> <version>1.2_0

如何根据Ip获取地址信息--Java----待整理完善!!!

QQWry.dat数据写入方法: http://www.cnblogs.com/xumingxiang/archive/2013/02/17/2914524.html java读取QQwry.dat获得ip地址对应实际位置: http://outofmemory.cn/code-snippet/541/java-duqu-QQwry-dat-get-ip-address-duiying-shiji-position QQwry格式如下: A.文件头,共8字节 B.若干条记录的结束地址+国家和区域

百度地图服务通过ip获取具体地址

//获取经纬度 var get="http://api.map.baidu.com/location/ip?ip=你的ip&ak=你的key&coor=bd09ll" 通过上面的接口可以获取IP的经纬度 //获取地址 var getaddres="http://api.map.baidu.com/geocoder/v2/?callback=renderReverse&location=上面的到的经纬度&output=json&pois=

ThinkPHP使用纯真IP获取物理地址时中文乱码问题

今天在用ThinkPHP通过纯真IP获取地址时,发现输出结果中文乱码,如图: 经查发现ThinkPHP的IpLocation.class.php类文件中说明:"由于使用UTF8编码 如果使用纯真IP地址库的话 需要对返回结果进行编码转换",修改浏览器编码毕竟不是长久之计, 于是尝试通过定义一个数组编码转换方法,如图: 此时修改getArea方法代码如下: 重新运行问题解决: 原文地址:https://www.cnblogs.com/splendid/p/9574642.html

C#获取本地计算机名,IP,MAC地址,硬盘ID

using System; using System.Data; using System.Configuration; using System.Linq; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.HtmlControls; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebPa

php 通过ip获取所在城市地址信息 获取计算机外网ip

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-

通过IP获取相应所在地的地址

曾几何时通过IP获取相应所在地的地址一直是一个梦想,曾经为止努力过,但效果并不是很好,现在将努力的成果(某些来源于网络)粘贴出来,希望对某些人有所启发,倘若有人有新的见解,还望不惜赐教: 1.借助外网实现获取IP相应所在地地址的目的: import java.io.InputStream; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.net.URL; import java.net.URL

linux c 网络编程:用域名获取IP地址或者用IP获取域名 网络地址转换成整型 主机字符顺序与网络字节顺序的转换

用域名获取IP地址或者用IP获取域名 #include<stdio.h> #include<sys/socket.h> #include<netdb.h> int main(int argc,char **aggv) { struct hostent *host; char hostname[]="www.163.com"; char hostname2[]="www.baidu.com"; struct in_addr in;