IP 來源查詢 php原始碼 (轉)
《追捕》現在已經響噹噹了,他的成功,在於它的的維護的毅力,
很多都在用它的資料,有些改了名字,變成xxx.dat了,嗬嗬,我覺得不太可取,有點兒不地道的感覺。
我的程式碼也用到了他,改不改名字無所謂了,關鍵尊重人家的勞動就好了。
在網頁上增加一個段簡單的程式碼,就可以顯示來訪者的地點。
還可以在自己的網站裡面寫一個個性化的日誌,記錄ip也記錄地點。
效果可以檢視 的左邊下角.
/**********************************************************************
* 來源追蹤 Ver 1.1a
* 作者 耙子 to:pazee@21cn.com">pazee@21cn.com
* 2002/08/10
*
* 中的資料庫來自《追捕》,請把追捕中wry.dll 複製到當前目錄。
* 追捕的資料庫是個的f,只不過它的副檔名字變成了dll。
* 2000年我在一個偶然的機會發現了他的dll的真實格式,後來的很多文章也提到了此格式,
* 《追捕》的資料檔案目前應用非常廣泛,很多查IP來源程式的基本都用到了他的資料庫。
* 比如有個去廣告,能顯示IP來源的qq就使用了他。
* 2001年初寫過一個php的函式,但是需要php的dbf模組支援,很多網站並不提供此模組。
* 現在的版本採用二進位制的檔案讀寫,不依賴php的dbf的支援了,沒有用到
* 任何命令.
* 由於資料檔案本身是有序的,所以非常方便的採用了折半查詢的演算法,
* 速度很快,目前的20020325版本的資料庫,大約有記錄28905條,最多比較14次。
*
* 在此感謝《追捕》作者“馮志宏”
* 有任何問題請於我聯絡,謝謝!
*
*
* 宣告:
* 你可以隨意傳播、複製、修改此程式,但是請保留此段文字。
* 程式碼請勿用在商業軟體上、請勿用在不正當的地方(這是《追捕》的要求),
* 再次表示謝謝。
***********************************************************************/
// define path of wry.dll
define("DBFILENAME", "wry.dll");
class TRec
{
var $StartIP;
var $EndIP;
var $Country;
var $Local;
}
class TWru
{
var $ip;
var $fp;
var $Rec;
var $DATAFIELDBEGIN= 0xc2;
var $RECORDLENGTH;
// Check IP and Format IP
function FormatIP($ip)
{
$ret= ereg("^([0-9]+).([0-9]+).([0-9]+).([0-9]+)$", $ip, $IPSection);
if ($ret == false)
return -1; // Invild IP
$this->ip= '';
for ($i=1; $i<=4; $i++)
if ($IPSection[$i] > 255)
return -1;
else
$this->ip.= sprintf("%03.0f", $IPSection[$i]). (($i<4) ? '.' : '');
return 0;
}
// read a record from DB
function ReadRec($RecNo)
{
$this->Seek($RecNo);
$buf= fread($this->fp, $this->RECORDLENGTH);
if (strlen($buf) == 0)
{
return 1;
}
$this->Rec->StartIP= (substr($buf, 0, 17));
$this->Rec->EndIP= trim(substr($buf, 17, 22));
$this->Rec->Country= trim(substr($buf, 17+22, 13));
$this->Rec->Local= trim(substr($buf, 17+22+13, 47));
return 0;
}
// Go to Record Number
function Seek($RecNo)
{
return fseek($this->fp, $RecNo * $this->RECORDLENGTH + $this->DATAFIELDBEGIN, SEEK_SET);
}
// Where_are_you Main Fucntion
/*********************************************
* 使用說明
* 引數:
* IP 合法即可
* szLocal 是儲存返回的結果字串的
* 返回值:
* 此函式有返回值,可以根據返回值自行處理結果
* 0: 查詢成功
* -1: 無效的IP
* 1: 開啟資料庫檔案失敗
* 2: 資料檔案錯誤(沒找到有效記錄)
* 3: 未知 IP
**********************************************/
function wru($ip, &$szLocal)
{
$this->Rec= new TRec;
$nRet= 0;
$this->RECORDLENGTH= 17 + 22 + 13 + 47 + 12 + 1;
if ($this->FormatIP($ip) != 0)
{
$szLocal= "InvalidIP";
return -1;
}
$this->fp= fopen(DBFILENAME, "rb");
if ($this->fp == NULL) {
$szLocal= "OpenFileError";
return 1;
}
// Get Record Count
fseek($this->fp, 0, SEEK_END);
$RecordCount= floor((ftell($this->fp) - $this->DATAFIELDBEGIN) / $this->RECORDLENGTH);
if ($RecordCount <= 1)
{
$szLocal= "FileDataError";
$nRet= 2;
}
else
{
$RangB= 0;
$RangE= $RecordCount;
// Match ...
while ($RangB < $RangE-1)
{
$RecNo= floor(($RangB + $RangE) / 2);
$this->ReadRec($RecNo);
if (strcmp($this->ip, $this->Rec->StartIP) >=0 && strcmp($this->ip, $this->Rec->EndIP) <=0 )
break; //Found match record
if (strcmp($this->ip, $this->Rec->StartIP) > 0)
$RangB= $RecNo;
else
$RangE= $RecNo;
}
if (!($RangB < $RangE-1))
{
$szLocal= "UnknowLocal!";
$nRet= 3;
}
else
{ // Match Success
$szLocal= $this->Rec->Country;
$szLocal.= $this->Rec->Local;
}
}
fclose($this->fp);
return $nRet;
}
}
/*******************************************************************
* 變更記錄:
* 2002/08/10 完成版本 1.0a
* 2002/08/12 增加FormatIP成員函式,提供了對IP的標準格式化,支援
* 202.96.128.68 這類的寫法,類的內部自動轉為 202.096.128.068,
* 同時提供了完整的對IP地址的有效檢查。規則是4個整數部分均不超
* 過255的自然數。
* ********************************************************************/
?>
// Test Code.
$wru= new TWru;
$szResult="";
$ip= "202.96.134.133";
// $ip= $REMOTE_ADDR;
$wru->wru($ip, $szResult);
echo $ip."
";
echo $szResult;
//---------------------------------------------------------------------------
?>
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-992796/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 如何離線查詢 IP 來源和 ISP 資訊
- 使用strace來查詢php的坑PHP
- IP查詢類API介面查詢,含各精度IP歸屬地查詢介面API
- 淘寶IP地址查詢
- ip地址查詢apiAPI
- 查詢論文原始碼網站原始碼網站
- druid查詢原始碼追蹤UI原始碼
- PostgreSQL 原始碼解讀(24)- 查詢語句#9(查詢重寫)SQL原始碼
- php模擬請求(偽造來源和請求ip)PHP
- PostgreSQL 原始碼解讀(29)- 查詢語句#14(查詢優化-上拉子查詢)SQL原始碼優化
- php-msf原始碼解讀【轉】PHP原始碼
- 通過php指令碼來查詢並替換mysql資料庫中的文字PHP指令碼MySql資料庫
- 如何查詢網站 ip 地址網站
- cmd命令如何查詢ip地址
- PostgreSQL 原始碼解讀(25)- 查詢語句#10(查詢優化概覽)SQL原始碼優化
- PostgreSQL 原始碼解讀(20)- 查詢語句#5(查詢樹Query詳解)SQL原始碼
- PostgreSQL 原始碼解讀(17)- 查詢語句#2(查詢優化基礎)SQL原始碼優化
- 線上客服系統原始碼-開源PHP版(開源im即時通訊原始碼)原始碼PHP
- PHP二分查詢PHP
- 各種免費好用的api,含天氣查詢、IP查詢、物流查詢等API
- 查詢佔用資源高的JAVA程式碼Java
- Oracle EBS環境下查詢資料來源(OAF篇)Oracle
- Oracle EBS環境下查詢資料來源(Form篇)OracleORM
- 看看我的jboss查詢資料來源的問題
- PostgreSQL 原始碼解讀(202)- 查詢#115(型別轉換)SQL原始碼型別
- php轉換ip函式PHP函式
- php查詢mssql出現亂碼的解決方法PHPSQL
- app直播原始碼,按照日期查詢聊天記錄APP原始碼
- 第 16 課 PostgreSQL查詢過程原始碼分析SQL原始碼
- myBatis原始碼解析-資料來源篇(3)MyBatis原始碼
- 查詢轉換
- 二分查詢【折半查詢】演算法 PHP 版演算法PHP
- 電腦ip地址在哪 電腦ip地址查詢方法
- PostgreSQL 原始碼解讀(36)- 查詢語句#21(查詢優化-消除外連線)SQL原始碼優化
- PostgreSQL 原始碼解讀(37)- 查詢語句#22(查詢優化-grouping_plan...SQL原始碼優化
- PostgreSQL 原始碼解讀(203)- 查詢#116(型別轉換實現)SQL原始碼型別
- 資料來源管理 | OLAP查詢引擎,ClickHouse叢集化管理
- 五種查詢Internet連線狀態[含IP]的方法 (轉)