찾다
php教程php手册php读取纯真ip数据库的例子

php读取纯真ip数据库的例子

Jun 13, 2016 am 09:39 AM
aspnet소프트웨어 프로그래밍

代码:

<?<span php
</span><span /*</span><span --------------------------------------------------
ip2address [qqwry.dat]
--------------------------------------------------</span><span */</span>
<span class</span><span  ip {
</span><span var</span> <span $fh</span>; <span //</span><span IP数据库文件句柄</span>
<span var</span> <span $first</span>; <span //</span><span 第一条索引</span>
<span var</span> <span $last</span>; <span //</span><span 最后一条索引</span>
<span var</span> <span $total</span>; <span //</span><span 索引总数
//构造函数</span>
<span function</span><span  __construct() {
</span><span $this</span>->fh = <span fopen</span>('qqwry.dat', 'rb'); <span //</span><span qqwry.dat文件</span>
<span $this</span>->first = <span $this</span>-><span getLong4();
</span><span $this</span>->last = <span $this</span>-><span getLong4();
</span><span $this</span>->total = (<span $this</span>->last - <span $this</span>->first) / 7; <span //</span><span 每条索引7字节</span>
<span }
</span><span //</span><span 检查IP合法性</span>
<span function</span> checkIp(<span $ip</span><span ) {
</span><span $arr</span> = <span explode</span>('.',<span $ip</span><span );
</span><span if</span>(<span count</span>(<span $arr</span>) !=4<span  ) {
</span><span return</span> <span false</span><span ;
} </span><span else</span><span  {
</span><span for</span> (<span $i</span>=0; <span $i</span> < 4; <span $i</span>++<span ) {
</span><span if</span> (<span $arr</span>[<span $i</span>] <'0' || <span $arr</span>[<span $i</span>] > '255'<span ) {
</span><span return</span> <span false</span><span ;
}
} </span><span //</span><span  脚本学堂 www.jbxue.com</span>
<span }
</span><span return</span> <span true</span><span ;
}
</span><span function</span><span  getLong4() {
</span><span //</span><span 读取little-endian编码的4个字节转化为长整型数</span>
<span $result</span> = <span unpack</span>('Vlong', <span fread</span>(<span $this</span>->fh, 4<span ));
</span><span return</span> <span $result</span>['long'<span ];
}
</span><span function</span><span  getLong3() {
</span><span //</span><span 读取little-endian编码的3个字节转化为长整型数</span>
<span $result</span> = <span unpack</span>('Vlong', <span fread</span>(<span $this</span>->fh, 3).<span chr</span>(0<span ));
</span><span return</span> <span $result</span>['long'<span ];
}
</span><span //</span><span 查询信息</span>
<span function</span> getInfo(<span $data</span> = ""<span ) {
</span><span $char</span> = <span fread</span>(<span $this</span>->fh, 1<span );
</span><span while</span> (<span ord</span>(<span $char</span>) != 0) { <span //</span><span 国家地区信息以0结束</span>
<span $data</span> .= <span $char</span><span ;
</span><span $char</span> = <span fread</span>(<span $this</span>->fh, 1<span );
}
</span><span return</span> <span $data</span><span ;
}
</span><span //</span><span 查询地区信息</span>
<span function</span><span  getArea() {
</span><span $byte</span> = <span fread</span>(<span $this</span>->fh, 1); <span //</span><span 标志字节</span>
<span switch</span> (<span ord</span>(<span $byte</span><span )) {
</span><span case</span> 0: <span $area</span> = ''; <span break</span>; <span //</span><span 没有地区信息</span>
<span case</span> 1: <span //</span><span 地区被重定向</span>
<span fseek</span>(<span $this</span>->fh, <span $this</span>-><span getLong3());
</span><span $area</span> = <span $this</span>->getInfo(); <span break</span><span ;
</span><span case</span> 2: <span //</span><span 地区被重定向</span>
<span fseek</span>(<span $this</span>->fh, <span $this</span>-><span getLong3());
</span><span $area</span> = <span $this</span>->getInfo(); <span break</span><span ;
</span><span default</span>: <span $area</span> = <span $this</span>->getInfo(<span $byte</span>); <span break</span>; <span //</span><span 地区没有被重定向</span>
<span }
</span><span return</span> <span $area</span><span ;
}
</span><span function</span> ip2addr(<span $ip</span><span ) {
</span><span if</span>(!<span $this</span> -> checkIp(<span $ip</span><span )){
</span><span return</span> <span false</span><span ;
}
</span><span $ip</span> = <span pack</span>('N', <span intval</span>(<span ip2long</span>(<span $ip</span><span )));
</span><span //</span><span 二分查找</span>
<span $l</span> = 0<span ;
</span><span $r</span> = <span $this</span>-><span total;
</span><span while</span>(<span $l</span> <= <span $r</span><span ) {
</span><span $m</span> = <span floor</span>((<span $l</span> + <span $r</span>) / 2); <span //</span><span 计算中间索引</span>
<span fseek</span>(<span $this</span>->fh, <span $this</span>->first + <span $m</span> * 7<span );
</span><span $beginip</span> = <span strrev</span>(<span fread</span>(<span $this</span>->fh, 4)); <span //</span><span 中间索引的开始IP地址</span>
<span fseek</span>(<span $this</span>->fh, <span $this</span>-><span getLong3());
</span><span $endip</span> = <span strrev</span>(<span fread</span>(<span $this</span>->fh, 4)); <span //</span><span 中间索引的结束IP地址</span>
<span if</span> (<span $ip</span> < <span $beginip</span>) { <span //</span><span 用户的IP小于中间索引的开始IP地址时</span>
<span $r</span> = <span $m</span> - 1<span ;
} </span><span else</span><span  {
</span><span if</span> (<span $ip</span> > <span $endip</span>) { <span //</span><span 用户的IP大于中间索引的结束IP地址时</span>
<span $l</span> = <span $m</span> + 1<span ;
} </span><span else</span> { <span //</span><span 用户IP在中间索引的IP范围内时</span>
<span $findip</span> = <span $this</span>->first + <span $m</span> * 7<span ;
</span><span break</span><span ;
}
}
}
</span><span //</span><span 查询国家地区信息</span>
<span fseek</span>(<span $this</span>->fh, <span $findip</span><span );
</span><span $location</span>['beginip'] = <span long2ip</span>(<span $this</span>->getLong4()); <span //</span><span 用户IP所在范围的开始地址</span>
<span $offset</span> = <span $this</span>-><span getlong3();
</span><span fseek</span>(<span $this</span>->fh, <span $offset</span><span );
</span><span $location</span>['endip'] = <span long2ip</span>(<span $this</span>->getLong4()); <span //</span><span 用户IP所在范围的结束地址</span>
<span $byte</span> = <span fread</span>(<span $this</span>->fh, 1); <span //</span><span 标志字节</span>
<span switch</span> (<span ord</span>(<span $byte</span><span )) {
</span><span case</span> 1: <span //</span><span 国家和区域信息都被重定向</span>
<span $countryOffset</span> = <span $this</span>->getLong3(); <span //</span><span 重定向地址</span>
<span fseek</span>(<span $this</span>->fh, <span $countryOffset</span><span );
</span><span $byte</span> = <span fread</span>(<span $this</span>->fh, 1); <span //</span><span 标志字节</span>
<span switch</span> (<span ord</span>(<span $byte</span><span )) {
</span><span case</span> 2: <span //</span><span 国家信息被二次重定向</span>
<span fseek</span>(<span $this</span>->fh, <span $this</span>-><span getLong3());
</span><span $location</span>['country'] = <span $this</span>-><span getInfo();
</span><span fseek</span>(<span $this</span>->fh, <span $countryOffset</span> + 4<span );
</span><span $location</span>['area'] = <span $this</span>-><span getArea();
</span><span break</span><span ;
</span><span default</span>: <span //</span><span 国家信息没有被二次重定向</span>
<span $location</span>['country'] = <span $this</span>->getInfo(<span $byte</span><span );
</span><span $location</span>['area'] = <span $this</span>-><span getArea();
</span><span break</span><span ;
}
</span><span break</span><span ;
</span><span case</span> 2: <span //</span><span 国家信息被重定向</span>
<span fseek</span>(<span $this</span>->fh, <span $this</span>-><span getLong3());
</span><span $location</span>['country'] = <span $this</span>-><span getInfo();
</span><span fseek</span>(<span $this</span>->fh, <span $offset</span> + 8<span );
</span><span $location</span>['area'] = <span $this</span>-><span getArea();
</span><span break</span><span ;
</span><span default</span>: <span //</span><span 国家信息没有被重定向</span>
<span $location</span>['country'] = <span $this</span>->getInfo(<span $byte</span><span );
</span><span $location</span>['area'] = <span $this</span>-><span getArea();
</span><span break</span><span ;
}
</span><span //</span><span gb2312 to utf-8(去除无信息时显示的CZ88.NET)</span>
<span foreach</span> (<span $location</span> <span as</span> <span $k</span> => <span $v</span><span ) {
</span><span $location</span>[<span $k</span>] = <span str_replace</span>('CZ88.NET','',<span iconv</span>('gb2312', 'utf-8', <span $v</span><span ));
}
</span><span return</span> <span $location</span><span ;
}
</span><span //</span><span 析构函数</span>
<span function</span><span  __destruct() {
</span><span fclose</span>(<span $this</span>-><span fh);
}
}
</span><span $ip</span> = <span new</span><span  ip();
</span><span $addr</span> = <span $ip</span> -> ip2addr('IP地址'<span );
</span><span print_r</span>(<span $addr</span><span );
</span>?>
성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25 : Myrise에서 모든 것을 잠금 해제하는 방법
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

Atom Editor Mac 버전 다운로드

Atom Editor Mac 버전 다운로드

가장 인기 있는 오픈 소스 편집기

맨티스BT

맨티스BT

Mantis는 제품 결함 추적을 돕기 위해 설계된 배포하기 쉬운 웹 기반 결함 추적 도구입니다. PHP, MySQL 및 웹 서버가 필요합니다. 데모 및 호스팅 서비스를 확인해 보세요.

ZendStudio 13.5.1 맥

ZendStudio 13.5.1 맥

강력한 PHP 통합 개발 환경

에디트플러스 중국어 크랙 버전

에디트플러스 중국어 크랙 버전

작은 크기, 구문 강조, 코드 프롬프트 기능을 지원하지 않음

SecList

SecList

SecLists는 최고의 보안 테스터의 동반자입니다. 보안 평가 시 자주 사용되는 다양한 유형의 목록을 한 곳에 모아 놓은 것입니다. SecLists는 보안 테스터에게 필요할 수 있는 모든 목록을 편리하게 제공하여 보안 테스트를 더욱 효율적이고 생산적으로 만드는 데 도움이 됩니다. 목록 유형에는 사용자 이름, 비밀번호, URL, 퍼징 페이로드, 민감한 데이터 패턴, 웹 셸 등이 포함됩니다. 테스터는 이 저장소를 새로운 테스트 시스템으로 간단히 가져올 수 있으며 필요한 모든 유형의 목록에 액세스할 수 있습니다.