Files
web-discuz/source/class/ip/ip_wry.php
2025-06-27 21:04:18 +08:00

171 lines
4.2 KiB
PHP
Executable File

<?php
/**
* [Discuz!] (C)2001-2099 Comsenz Inc.
* This is NOT a freeware, use is subject to license terms
*
* $Id: ip_wry.php 3915 2019-12-03 12:00:00Z opensource $
*/
if(!defined('IN_DISCUZ')) {
exit('Access Denied');
}
class ip_wry_init_exception extends Exception {}
class ip_wry {
private static $instance = null;
private $fp = null;
private $ipbegin = null;
private $ipAllNum = null;
private function __construct() {
$ipdatafile = constant("DISCUZ_ROOT").'./data/ipdata/wry.dat';
$this->fp = fopen($ipdatafile, 'rb');
if (!$this->fp) {
throw new ip_wry_init_exception();
}
if(!($DataBegin = fread($this->fp, 4)) || !($DataEnd = fread($this->fp, 4)) ) throw new ip_wry_init_exception();
$this->ipbegin = implode('', unpack('L', $DataBegin));
if($this->ipbegin < 0) $this->ipbegin += pow(2, 32);
$ipend = implode('', unpack('L', $DataEnd));
if($ipend < 0) $ipend += pow(2, 32);
$this->ipAllNum = ($ipend - $this->ipbegin) / 7 + 1;
}
function __destruct() {
if ($this->fp) {
@fclose($this->fp);
}
}
public static function getInstance() {
if (!self::$instance) {
try {
self::$instance = new ip_wry();
} catch (Exception $e) {
return null;
}
}
return self::$instance;
}
public function convert($ip) {
$ip = explode('.', $ip);
$ipNum = $ip[0] * 16777216 + $ip[1] * 65536 + $ip[2] * 256 + $ip[3];
$BeginNum = $ip2num = $ip1num = 0;
$ipAddr1 = $ipAddr2 = '';
$EndNum = $this->ipAllNum;
while($ip1num > $ipNum || $ip2num < $ipNum) {
$Middle= intval(($EndNum + $BeginNum) / 2);
fseek($this->fp, $this->ipbegin + 7 * $Middle);
$ipData1 = fread($this->fp, 4);
if(strlen($ipData1) < 4) {
return '- System Error';
}
$ip1num = implode('', unpack('L', $ipData1));
if($ip1num < 0) $ip1num += pow(2, 32);
if($ip1num > $ipNum) {
$EndNum = $Middle;
continue;
}
$DataSeek = fread($this->fp, 3);
if(strlen($DataSeek) < 3) {
return '- System Error';
}
$DataSeek = implode('', unpack('L', $DataSeek.chr(0)));
fseek($this->fp, $DataSeek);
$ipData2 = fread($this->fp, 4);
if(strlen($ipData2) < 4) {
return '- System Error';
}
$ip2num = implode('', unpack('L', $ipData2));
if($ip2num < 0) $ip2num += pow(2, 32);
if($ip2num < $ipNum) {
if($Middle == $BeginNum) {
return '- Unknown';
}
$BeginNum = $Middle;
}
}
$ipFlag = fread($this->fp, 1);
if($ipFlag == chr(1)) {
$ipSeek = fread($this->fp, 3);
if(strlen($ipSeek) < 3) {
return '- System Error';
}
$ipSeek = implode('', unpack('L', $ipSeek.chr(0)));
fseek($this->fp, $ipSeek);
$ipFlag = fread($this->fp, 1);
}
if($ipFlag == chr(2)) {
$AddrSeek = fread($this->fp, 3);
if(strlen($AddrSeek) < 3) {
return '- System Error';
}
$ipFlag = fread($this->fp, 1);
if($ipFlag == chr(2)) {
$AddrSeek2 = fread($this->fp, 3);
if(strlen($AddrSeek2) < 3) {
return '- System Error';
}
$AddrSeek2 = implode('', unpack('L', $AddrSeek2.chr(0)));
fseek($this->fp, $AddrSeek2);
} else {
fseek($this->fp, -1, SEEK_CUR);
}
while(($char = fread($this->fp, 1)) != chr(0))
$ipAddr2 .= $char;
$AddrSeek = implode('', unpack('L', $AddrSeek.chr(0)));
fseek($this->fp, $AddrSeek);
while(($char = fread($this->fp, 1)) != chr(0))
$ipAddr1 .= $char;
} else {
fseek($this->fp, -1, SEEK_CUR);
while(($char = fread($this->fp, 1)) != chr(0))
$ipAddr1 .= $char;
$ipFlag = fread($this->fp, 1);
if($ipFlag == chr(2)) {
$AddrSeek2 = fread($this->fp, 3);
if(strlen($AddrSeek2) < 3) {
return '- System Error';
}
$AddrSeek2 = implode('', unpack('L', $AddrSeek2.chr(0)));
fseek($this->fp, $AddrSeek2);
} else {
fseek($this->fp, -1, SEEK_CUR);
}
while(($char = fread($this->fp, 1)) != chr(0))
$ipAddr2 .= $char;
}
if(preg_match('/http/i', $ipAddr2)) {
$ipAddr2 = '';
}
$ipaddr = "$ipAddr1 $ipAddr2";
$ipaddr = preg_replace('/CZ88\.NET/is', '', $ipaddr);
$ipaddr = preg_replace('/^\s*/is', '', $ipaddr);
$ipaddr = preg_replace('/\s*$/is', '', $ipaddr);
if(preg_match('/http/i', $ipaddr) || $ipaddr == '') {
$ipaddr = '- Unknown';
}
return '- '.diconv($ipaddr, 'GBK');
}
}
?>