当前位置:网站首页>PHP调用纯真IP数据库返回具体地址
PHP调用纯真IP数据库返回具体地址
2022-07-07 10:36:00 【全栈程序员站长】
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;
}
只要调用此方法,传入一个正确的IP地址,就能得到纯真IP数据库中相对应的地理位置了
例如:
convertip(202.96.209.5)
返回的值为:上海市 电信
注:写有此方法的文件需和纯真数据库文件(QQWry.Dat)放在同一级目录,否则就需要修改$dat_path的内容。
准备工作:
建议本地IP地址数据库,请到http://www.cz88.net/这个网站下载一个纯真IP数据库,安装完成后,到安装目录里把QQWry.dat文件取出来,这个就是我们想要的IP数据库了,放到你想要目录下。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/113445.html原文链接:https://javaforall.cn
边栏推荐
- Several methods of checking JS to judge empty objects
- gcc 编译报错
- NGUI-UILabel
- File upload vulnerability - upload labs (1~2)
- 2022危险化学品生产单位安全生产管理人员考题及在线模拟考试
- [play RT thread] RT thread Studio - key control motor forward and reverse rotation, buzzer
- Using stack to convert binary to decimal
- 【从 0 开始学微服务】【01】什么是微服务
- [pytorch practice] use pytorch to realize image style migration based on neural network
- Static routing assignment of network reachable and telent connections
猜你喜欢
【统计学习方法】学习笔记——支持向量机(上)
Tutorial on principles and applications of database system (010) -- exercises of conceptual model and data model
JS to convert array to tree data
OSPF exercise Report
[pytorch practice] use pytorch to realize image style migration based on neural network
About web content security policy directive some test cases specified through meta elements
ENSP MPLS layer 3 dedicated line
SQL head injection -- injection principle and essence
leetcode刷题:二叉树22(二叉搜索树的最小绝对差)
SQL Lab (36~40) includes stack injection, MySQL_ real_ escape_ The difference between string and addslashes (continuous update after)
随机推荐
[疑难杂症]pip运行突然出现ModuleNotFoundError: No module named ‘pip‘
What is an esp/msr partition and how to create an esp/msr partition
Multi row and multi column flex layout
Experiment with a web server that configures its own content
Tutorial on principles and applications of database system (010) -- exercises of conceptual model and data model
Solutions to cross domain problems
Processing strategy of message queue message loss and repeated message sending
<No. 9> 1805. Number of different integers in the string (simple)
Will the filing free server affect the ranking and weight of the website?
sql-lab (54-65)
2022广东省安全员A证第三批(主要负责人)考试练习题及模拟考试
SQL Lab (46~53) (continuous update later) order by injection
平安证券手机行开户安全吗?
数据库安全的重要性
【二叉树】删点成林
Tutorial on principles and applications of database system (009) -- conceptual model and data model
Static routing assignment of network reachable and telent connections
30. Feed shot named entity recognition with self describing networks reading notes
金融数据获取(三)当爬虫遇上要鼠标滚轮滚动才会刷新数据的网页(保姆级教程)
The IDM server response shows that you do not have permission to download the solution tutorial