当前位置:网站首页>PHP calls the pure IP database to return the specific address
PHP calls the pure IP database to return the specific address
2022-07-07 12:51:00 【Full stack programmer webmaster】
function convertip($ip) {
$ip1num = 0;
$ip2num = 0;
$ipAddr1 ="";
$ipAddr2 ="";
$dat_path = './QQWry.Dat';
if(!preg_match("/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/", $ip)) {
return 'IP Address Error';
}
if(!$fd = @fopen($dat_path, 'rb')){
return 'IP date file not exists or access denied';
}
$ip = explode('.', $ip);
$ipNum = $ip[0] * 16777216 + $ip[1] * 65536 + $ip[2] * 256 + $ip[3];
$DataBegin = fread($fd, 4);
$DataEnd = fread($fd, 4);
$ipbegin = implode('', unpack('L', $DataBegin));
if($ipbegin < 0) $ipbegin += pow(2, 32);
$ipend = implode('', unpack('L', $DataEnd));
if($ipend < 0) $ipend += pow(2, 32);
$ipAllNum = ($ipend - $ipbegin) / 7 + 1;
$BeginNum = 0;
$EndNum = $ipAllNum;
while($ip1num>$ipNum || $ip2num<$ipNum) {
$Middle= intval(($EndNum + $BeginNum) / 2);
fseek($fd, $ipbegin + 7 * $Middle);
$ipData1 = fread($fd, 4);
if(strlen($ipData1) < 4) {
fclose($fd);
return 'System Error';
}
$ip1num = implode('', unpack('L', $ipData1));
if($ip1num < 0) $ip1num += pow(2, 32);
if($ip1num > $ipNum) {
$EndNum = $Middle;
continue;
}
$DataSeek = fread($fd, 3);
if(strlen($DataSeek) < 3) {
fclose($fd);
return 'System Error';
}
$DataSeek = implode('', unpack('L', $DataSeek.chr(0)));
fseek($fd, $DataSeek);
$ipData2 = fread($fd, 4);
if(strlen($ipData2) < 4) {
fclose($fd);
return 'System Error';
}
$ip2num = implode('', unpack('L', $ipData2));
if($ip2num < 0) $ip2num += pow(2, 32);
if($ip2num < $ipNum) {
if($Middle == $BeginNum) {
fclose($fd);
return 'Unknown';
}
$BeginNum = $Middle;
}
}
$ipFlag = fread($fd, 1);
if($ipFlag == chr(1)) {
$ipSeek = fread($fd, 3);
if(strlen($ipSeek) < 3) {
fclose($fd);
return 'System Error';
}
$ipSeek = implode('', unpack('L', $ipSeek.chr(0)));
fseek($fd, $ipSeek);
$ipFlag = fread($fd, 1);
}
if($ipFlag == chr(2)) {
$AddrSeek = fread($fd, 3);
if(strlen($AddrSeek) < 3) {
fclose($fd);
return 'System Error';
}
$ipFlag = fread($fd, 1);
if($ipFlag == chr(2)) {
$AddrSeek2 = fread($fd, 3);
if(strlen($AddrSeek2) < 3) {
fclose($fd);
return 'System Error';
}
$AddrSeek2 = implode('', unpack('L', $AddrSeek2.chr(0)));
fseek($fd, $AddrSeek2);
} else {
fseek($fd, -1, SEEK_CUR);
}
while(($char = fread($fd, 1)) != chr(0))
$ipAddr2 .= $char;
$AddrSeek = implode('', unpack('L', $AddrSeek.chr(0)));
fseek($fd, $AddrSeek);
while(($char = fread($fd, 1)) != chr(0))
$ipAddr1 .= $char;
} else {
fseek($fd, -1, SEEK_CUR);
while(($char = fread($fd, 1)) != chr(0))
$ipAddr1 .= $char;
$ipFlag = fread($fd, 1);
if($ipFlag == chr(2)) {
$AddrSeek2 = fread($fd, 3);
if(strlen($AddrSeek2) < 3) {
fclose($fd);
return 'System Error';
}
$AddrSeek2 = implode('', unpack('L', $AddrSeek2.chr(0)));
fseek($fd, $AddrSeek2);
} else {
fseek($fd, -1, SEEK_CUR);
}
while(($char = fread($fd, 1)) != chr(0)){
$ipAddr2 .= $char;
}
}
fclose($fd);
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 $ipaddr;
}
Just call this method , Pass in a correct IP Address , You can get innocence IP data The corresponding geographical location in the Library
for example :
convertip(202.96.209.5)
The returned value is : Shanghai telecom
notes : The file with this method needs to be combined with the pure database file (QQWry.Dat) Put it in the same level directory , Otherwise, it needs to be modified $dat_path The content of .
preparation :
Suggest local IP Address database , succeed in inviting sb. http://www.cz88.net/ This website downloads a pure IP database , After installation , Go to the installation directory QQWry.dat Take out the documents , This is what we want IP Database , Put it in the directory you want .
Publisher : Full stack programmer stack length , Reprint please indicate the source :https://javaforall.cn/113445.html Link to the original text :https://javaforall.cn
边栏推荐
- 2022危险化学品生产单位安全生产管理人员考题及在线模拟考试
- 2022 polymerization process test question simulation test question bank and online simulation test
- 【统计学习方法】学习笔记——支持向量机(上)
- Object. Simple implementation of assign()
- Leetcode question brushing: binary tree 26 (insertion operation in binary search tree)
- 【从 0 开始学微服务】【02】从单体应用走向服务化
- Master formula. (used to calculate the time complexity of recursion.)
- [爬虫]使用selenium时,躲避脚本检测
- leetcode刷题:二叉树27(删除二叉搜索树中的节点)
- ip2long与long2IP 分析
猜你喜欢
智云健康上市:市值150亿港元 SIG经纬与京新基金是股东
opencv的四个函数
[statistical learning method] learning notes - logistic regression and maximum entropy model
Four functions of opencv
Decrypt gd32 MCU product family, how to choose the development board?
Financial data acquisition (III) when a crawler encounters a web page that needs to scroll with the mouse wheel to refresh the data (nanny level tutorial)
Common knowledge of one-dimensional array and two-dimensional array
2022 examination questions and online simulation examination for safety production management personnel of hazardous chemical production units
【统计学习方法】学习笔记——支持向量机(下)
如何将 @Transactional 事务注解运用到炉火纯青?
随机推荐
智云健康上市:市值150亿港元 SIG经纬与京新基金是股东
2022聚合工艺考试题模拟考试题库及在线模拟考试
OSPF exercise Report
How to apply @transactional transaction annotation to perfection?
leetcode刷题:二叉树20(二叉搜索树中的搜索)
明星企业普渡科技大裁员:曾募资超10亿 腾讯红杉是股东
MySQL importing SQL files and common commands
【统计学习方法】学习笔记——第四章:朴素贝叶斯法
[learn microservices from 0] [03] explore the microservice architecture
Day-17 connection set
[learn wechat from 0] [00] Course Overview
Master公式。(用于计算递归的时间复杂度。)
Find ID value MySQL in string
爱可可AI前沿推介(7.7)
图形对象的创建与赋值
2022 examination questions and online simulation examination for safety production management personnel of hazardous chemical production units
Configure an encrypted web server
如何将 @Transactional 事务注解运用到炉火纯青?
【统计学习方法】学习笔记——支持向量机(下)
Day-14 common APIs