tvzml 发表于 2014-10-3 18:12:01

LOL《英雄联盟》测速工具 V2.0

本帖最后由 tvzml 于 2014-10-6 21:57 编辑

亲爱的召唤师,亲爱小伙伴们,当今最火热的网络游戏《英雄联盟》LOL,个别区卡的时候,你是不是在忙于和客户解释呢?你是不是为客户的不理解而发愁呢?因环境需要今天写了这款LOL全网服务器测速对比工具,可以直观的显示出客户当前分区的网络状态和速度。

V2.0 改进:
1. 隐藏IP地址后5位,本地不保存IP地址。
2. 支持地理位置 和 线路识别 ,IP地址库取纯真IP地址数据库。
3. 新增采集IP功能(需要安装winpcap驱动)


10月6号修正卡住问题:
下载地址 http://pan.baidu.com/s/1o6JTRse

zhongzijie 发表于 2014-10-3 19:49:33

真不錯啊,謝謝樓主。

zhaoyun 发表于 2014-10-4 07:16:33

,謝謝樓主。

zhaoyun 发表于 2014-10-5 07:56:30

謝謝樓主分享。

header 发表于 2014-10-6 09:19:50

关注ip查询地理位置的方法

diana222 发表于 2014-10-6 09:34:41

你测速也没用。。。人家就说你网吧网速垃圾了

tvzml 发表于 2014-10-6 22:01:02

回复 6# diana222

有些家伙明明是浙江用户,他偏要玩广东区,他卡的时候,你就可以有理由说是区域关系,让他换浙江区啦,他不换哪是他自己问题了,如果全部区延迟高,基本是本地网络问题了,有助于排查问题使在。

tvzml 发表于 2014-10-6 22:05:26

本帖最后由 tvzml 于 2014-10-6 22:08 编辑

关注ip查询地理位置的方法
header 发表于 2014-10-6 09:19 http://www.autoitx.com/images/common/back.gif

调用了 PHP



<?php
/**
* IP 地理位置查询类
*   
* @author joyphper
* @version 1.0
* @copyright 2010 joyphper.net
*/

class IpLocation {
   /**
      * QQWry.Dat文件指针
      *
      * @var resource
      */

   private $fp;

   /**
      * 第一条IP记录的偏移地址
      *
      * @var int
      */

   private $firstip;

   /**
      * 最后一条IP记录的偏移地址
      *
      * @var int
      */

   private $lastip;

   /**
      * IP记录的总条数(不包含版本信息记录)
      *
      * @var int
      */
      
   private $totalip;

    /**
      * 构造函数,打开 QQWry.Dat 文件并初始化类中的信息
      *
      * @param string $filename
      * @return IpLocation
      */

   public function __construct($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, '__destruct'));
               
         }

   }

   /**

      * 析构函数,用于在页面执行结束后自动关闭打开的文件。
      *
      */

    public function __destruct() {

         if ($this->fp) {

             fclose($this->fp);

         }

         $this->fp = 0;

   }
      
   /**

      * 返回读取的长整型数
      *
      * @access private
      * @return int
      */

    private function getlong() {

         //将读取的little-endian编码的4个字节转化为长整型数

         $result = unpack('Vlong', fread($this->fp, 4));

         return $result['long'];

   }

   /**

      * 返回读取的3个字节的长整型数
      *
      * @access private
      * @return int
      */

   private 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
      */

   private 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
      */

   private 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
      */

   private 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
      */

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

   }
}

?>

<?php
$ip = $_GET['ip'];   
$iplocation = new IpLocation();   
$location = $iplocation->getlocation($ip);   

//print_r($location);
echo $location['ip'];
echo "|";
echo $location['country'];
echo "|";
echo $location['area'];
?>



查询方法 :http://youname.com/ip.php?ip=61.153.224.189
返回数据:61.153.224.189|浙江省嘉兴市|电信

wang754782072 发表于 2014-10-7 18:52:52

好牛逼的样子,支持一下啦

wei_tianxia 发表于 2024-5-13 02:23:52

66666666666666666666666
页: [1]
查看完整版本: LOL《英雄联盟》测速工具 V2.0