1. 程式人生 > >PHP獲取IP地址所在地資訊(使用純真IP資料庫qqwry.dat)

PHP獲取IP地址所在地資訊(使用純真IP資料庫qqwry.dat)

<?php
 $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格式儲存,以\0結束
            $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 $data = '254.254.254.254'; echo ip2long($data); function getIP() { if(getenv("HTTP_CLIENT_IP") && strcasec

PHP獲取IP地址的方法,防止偽造IP地址註入攻擊

false online ESS -a null del known sdn 信息 原文:PHP獲取IP地址的方法,防止偽造IP地址註入攻擊PHP獲取IP地址的方法 /** * 獲取客戶端IP地址 * <br />來源:ThinkPHP * &

利用python爬取IP地址歸屬資訊

import requests url = "http://m.ip138.com/ip.asp?ip=" try: r = requests.get(url + '202.204.80.112') r.raise_for_status()

獲取使用者IP地址和瀏覽器資訊

function getYourIP() { var RTCPeerConnection = window.RTCPeerConnection || window.webkitRTCPeerConnection || window.mozRTCPeerConnection; if (

通過ip地址獲取ip地址的區域資訊

return $res1['data']["country"].$res1['data'][ "region"].$res1['data']["city"]."_".$res1['data'][ "isp"];

C# 獲取IP地址、主機資訊(Host)、瀏覽器資訊

using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Sockets; using System.Web; names

C語言獲取本地所有網絡卡的ip地址及MAC資訊

  本程式在ubuntu下執行成功,後再centos系統下也能編譯成功並執行。原始碼如下    // demo01.c #include <stdio.h> #include <stdlib.h> #include <str

IP地址歸屬查詢

.py 庫文件 int python 查找 error pda col 程序 http://www.ipip.net/download.html#ip_code 下載免費版 IP 地址數據庫。 網站下面有官方給出的查找IP地址所屬國家、省、市的辦法。 python版

PHP獲取客戶端和服務器端IP(轉)

light 代理ip pre 客戶端測試 function 變量 clas env 環境 客戶端的ip變量: $_SERVER[‘REMOTE_ADDR‘] :客戶端IP,也有可能是代理IP $_SERVER[‘HTTP_CLIENT_IP‘]:代理端的IP,可能存在,也可

golang IP地址歸屬查詢(walk介面庫)

package main import ( "encoding/json" "fmt" "io/ioutil" "log" "net" "net/http" ) import ( "github.com/lxn/walk" . "github.com/lxn/walk/dec

NGINX,PHP獲取Cloudflare傳遞的真實訪客IP 配合寶塔面板防禦CC攻擊 防偽造IP 日誌記

from: https://www.bnxb.com/php/27592.html Cloudflare獲取訪客真實IP,獲取cf傳遞的真實訪客ip,再結合我們的cdn.bnxb.com的批量提交IP給CF的防火牆的功能,可以實現抵禦CC攻擊的功能,將CC攻擊者的連線IP給封殺在CDN

根據ip地址定位城市資訊

最近需要一個需求就是根據ip地址獲取使用者的地址資訊,搜尋了網上的方法,有H5定位和呼叫web api介面定位. 相比之下H5要求瀏覽器支援,在移動裝置上可以實現呼叫手機gps獲取位置資訊,精確度很高。web api定位可以定位到城市,相對來說精確度不高,對比了百度,高德,淘寶,新浪的web a

php獲取http頭部請求狀態資訊

我們在使用站長工具會發現有一個獲取網站http狀態資訊了,其實這個功能使用php非常的簡單的,我們可以使用curl來實現下面來看一些整理的例子。使用curl需要在php.ini中設定啟用才行 >< Windows的伺服器中,開啟php.ini,找到:extensi

java IP地址工具類,java IP地址獲取,java獲取客戶端IP地址

java IP地址工具類,java IP地址獲取,java獲取客戶端IP地址   ================================ ©Copyright 蕃薯耀 2019年1月11日 http://fanshuyao.iteye.com/   impo

iOS 如何獲取手機外網IP地址(附內網IP地址

查找了一些方法,最初以為拿到的就是手機對外的公網地址,其實只是本地IP地址。下面把獲取手機內外網IP地址的方法總結下: 一、獲取手機本地靜態IP地址:(區域網) 方法1: 首先匯入標頭檔案: //IP地址需求庫 #import <sys/socket.h> #

php判斷IP地址是否在多個IP段內

IP.class.php <?php class Ip { /** * 取IP * @return string */ public static

IP地址歸屬查詢演算法

IP地址歸屬地查詢: 將IP地址轉換成數值型,進行範圍匹配 Java版: /** * ip地址轉換成Long型別數值,用以匹配ip地址所屬地 */ public static Long ip2Long(f

批量查詢ip地址歸屬教程

start exc ces lin sele RoCE 相關信息 ont data 網上基本都是只能單個查詢,這個可以批量查詢,支持導出TXT和Excel,而且不限制數量。先上圖 使用方法:(1)導入TXT(2)標準化(3)開始查詢即可 ??? 如果需要請關註微

Centos如何設置IP地址,LINUX怎麽修改IP地址

acc rop cbe content orm default 永久生效 img etc Centos如何設置IP地址,LINUX怎麽修改IP地址 1 2 3 4 5 6 7 分步閱讀 百度經驗:jingyan.baidu.com

32位二進制IP地址與十進制IP地址互相轉換

bin parseint 轉換 idt result 32位 temp str ann 代碼: 1 import java.util.List; 2 import java.util.ArrayList; 3 import java.util.Scanner;