- 浏览: 143973 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
wokcao:
这里的platforms是linux的版本么?
Android SDK Download List -
zhangtianfeng:
我看了 一些D语言的一些介绍,对于的产生还是有的疑惑.
Dmd编译器学习笔记 -
qiezi:
.so文件是用-L来指定的,比如gcc的-levent是用来链 ...
Dmd编译器学习笔记 -
tomqyp:
...
Ddoc文档注释学习笔记 -
sofire:
转换成其他语言?是说用汉字吗?
Ddoc文档注释学习笔记
改写了QQIP地址库的查询程序,学习了怎么操作文件。
也学会了正确使用tar命令。
本来想把 ip.d ip.php 和 QQWry.dat 文件打包成 a.tgz的,
结果把命令写成了 tar czf ip.d ip.php QQWry.dat a.tgz
把辛辛苦苦的写的程序给覆盖了:(
重新写了一遍,发现还是很快的。
也学会了正确使用tar命令。
本来想把 ip.d ip.php 和 QQWry.dat 文件打包成 a.tgz的,
结果把命令写成了 tar czf ip.d ip.php QQWry.dat a.tgz
把辛辛苦苦的写的程序给覆盖了:(
重新写了一遍,发现还是很快的。
/** * QQWry.dat IP地址库的查找程序 * Edit by Liu Dehong @ 2007/08/08 * Version: 1.0.0 * * 改编自 马秉尧 的PHP程序 * QQWry.dat 来自于 CZ88.net * Q数据库的格式参考:http://www.pconline.com.cn/pcedu/empolder/gj/java/0505/612860.html */ import std.stdio; import std.stream; import std.string; import std.math; extern(C) { uint ntohl(uint); uint inet_addr(char *cp); uint htonl(uint hostlong); char* inet_ntoa(in_addr); struct in_addr { uint s_addr; } } uint ip2long(char[] ip) { return ntohl(inet_addr(toStringz(ip))); } char[] long2ip(ulong ip) { in_addr myaddr; myaddr.s_addr = htonl(ip); return toString(inet_ntoa(myaddr)).dup; } class IpLocation { private File m_file; private uint m_firstip; // 第一条IP记录的偏移地址 private uint m_lastip; // 最后一条IP记录的偏移地址 private uint m_totalip; // IP记录的总条数(不包含版本信息记录) static assert (int.sizeof == 4); static assert (uint.sizeof == 4); static assert (long.sizeof == 8); /* 从文件读取4个字节,返回整型数 */ uint get4Byte() { uint i; m_file.read(i); return i; } /* 从文件读取3个字节的数据,返回整型数 */ uint get3Byte() { ubyte c; uint sum; int[3] pow = [1, 256, 256*256]; /** * 如读取的是 2 34 56 ,则结果是 2 + 34*256 + 56*256*256 */ for (int i; i < 3; i++) { m_file.read(c); sum += c * pow[i]; } return sum; } /* 返回读取的字符串 */ char[] getString() { debug(1) writefln("GetString's pos: %d(%X)", m_file.position, m_file.position); ubyte c; char[] str = new char[100]; // guess int i; for (i = 0; true; i++) { m_file.read(c); if (c == 0) // 字符串按照C格式保存,以\0结束 break; if (i == str.length) str.length = str.length * 2; str[i] = c; } str.length = i; return str; } /* 返回地区信息 */ char[] getArea() { debug(1) writefln("GetArea's pos: %d(%X)", m_file.position, m_file.position); ubyte flag; // 标志字节 char[] area; m_file.read(flag); switch (flag) { case 0: // 没有区域信息 area = ""; break; case 1: case 2: // 标志字节为1或2,表示区域信息被重定向 m_file.position(get3Byte()); area = getString(); break; default: // 否则,表示区域信息没有被重定向 area = cast(char)flag ~ getString(); // flag 是一个字符 break; } return area; } /* 根据所给 IP 地址或域名返回所在地区信息 * 索取区按照地址从小到大排列,用折半算法查找 */ string[string] getLocation(char[] addr) { if ( ! m_file.readable) return null; /* 查找纪录区的位置 */ uint l = 0; // 搜索的下边界 uint u = m_totalip; // 搜索的上边界 uint findip = m_lastip; // 如果没有找到就返回最后一条IP记录(QQWry.Dat的版本信息) uint i; uint beginip; uint endip; auto ip_t = ip2long(addr); while (l <= u) // 当上边界小于下边界时,查找失败 { i = std.math.lround((l + u) / 2); m_file.position(m_firstip + i * 7); m_file.read(beginip); if (ip_t < beginip) { u = i - 1; } else { m_file.position(get3Byte()); m_file.read(endip); if (ip_t > endip) { l = i + 1; } else { findip = m_firstip + i * 7; // find it break; } } } debug(1) writefln("Findip is: %d(%#X)", findip, findip); /* 获取查找到的IP地理位置信息 */ string[string] location; m_file.position(findip); location["beginip"] = long2ip(get4Byte()); // 用户IP所在范围的开始地址 auto offset = get3Byte(); m_file.position(offset); location["endip"] = long2ip(get4Byte()); // 用户IP所在范围的结束地址 ubyte flag1, flag2; // 标志字节 m_file.read(flag1); switch (flag1) { case 1: // 标志字节为1,表示国家和区域信息都被同时重定向 auto countryOffset = get3Byte(); // 重定向地址 m_file.position(countryOffset); m_file.read(flag2); // 标志字节 switch (flag2) { case 2: // 标志字节为2,表示国家信息又被重定向 m_file.position(get3Byte()); location["country"] = getString(); m_file.position(countryOffset + 4); location["area"] = getArea(); break; default: // 否则,表示国家信息没有被重定向 location["country"] = cast(char)flag2 ~ getString(); // flag2 是一个字符 location["area"] = getArea(); break; } break; case 2: // 标志字节为2,表示国家信息被重定向 m_file.position(get3Byte()); location["country"] = getString(); m_file.position(offset + 8); // IP地址(4B) + 定向模式(1B) + 偏移地址(3B) location["area"] = getArea(); break; default: // 否则,表示国家信息没有被重定向 location["country"] = cast(char)flag1 ~ getString(); // flag1是一个字符 location["area"] = getArea(); break; } debug(1) writefln("Flag1&2 : %d %d", flag1, flag2); if (location["country"] == " CZ88.NET") // CZ88.NET表示没有有效信息 { location["country"] = "unkown"; } if (location["area"] == " CZ88.NET") { location["area"] = ""; } return location; } /** * 构造函数,打开 QQWry.Dat 文件并初始化类中的信息 */ this(char[] filename = "QQWry.Dat") { m_file = new File(filename); m_firstip = get4Byte(); m_lastip = get4Byte(); m_totalip = (m_lastip - m_firstip) / 7; } uint firstip() { return m_firstip; } uint lastip() { return m_lastip; } uint totalip() { return m_totalip; } } void main() { auto ipObj = new IpLocation; writefln("First IP is: %s", ipObj.firstip); writefln("Last IP is : %s", ipObj.lastip); writefln("Total ip is: %s", ipObj.totalip); string[] myips = [ "0.255.255.255", "0.255.255.255", "1.255.255.255", "4.10.255.255", "4.10.255.255", "4.19.77.255", "59.57.7.206", "222.79.141.30", "211.100.32.245", "202.106.184.145", "202.205.82.122", "0.1.163.136", ]; string[string] loc; foreach (int k, string v; myips) { loc = ipObj.getLocation(v); printf("%*s in [%.*s ~ %.*s]"\n, v, loc["beginip"], loc["endip"]); printf("Country: %-20.*s Area: %-20.*s"\n, loc["country"], loc["area"]); } }
- IpLocation.zip (3.2 MB)
- 描述: 包括:D语言的源程序,PHP版本的程序,QQWry的数据库文件和格式说明文件
- 下载次数: 44
发表评论
-
Dmd编译器学习笔记
2007-08-15 17:28 4562Dmd编译器学习笔记 英文原文在这里: http://dig ... -
Ddoc文档注释学习笔记
2007-08-14 02:49 4746Ddoc学习笔记 ddoc的英文 ... -
[zt]D语言编译器下载安装和编译参数
2007-08-13 10:53 5472Javaeye的html编辑器用起来不爽。 不知道怎么用UBB ... -
Build编译工具学习笔记:常用命令参数和BRF文件
2007-08-12 23:42 5949build工具的主页在:http://www.dsource. ... -
iconv库函数的学习程序
2007-08-11 23:40 4816以前用php的iconv函数, ... -
用expat 库解析XML的学习例子
2007-08-10 17:20 4629用bcdgen转换的头文件。 对xml不大感兴趣。只是尝试用D ... -
memcached函数的学习程序
2007-08-10 12:26 2695尝试把 libmemcached的示例程序改成D语言的。 源程 ... -
ip2long和long2ip的学习程序
2007-08-08 13:00 2947这2个是PHP里面的常用函数,用D重新包装了一下。 虽然可以使 ... -
md5函数的学习程序
2007-08-07 15:52 1452前面部分是库文件里面的例子,后面是我改的。 写起来和PHP差不 ... -
writef和printf函数的学习程序
2007-08-07 15:29 2316和C函数的格式相同。 只是printf和writef中的 s ... -
【备忘】D语言编译器的下载地址、安装方法
2007-08-07 00:09 2142在D语言主页上,老是找不到编译器的安装程序。 后来好不容易一个 ... -
base64函数的学习程序
2007-08-06 20:17 3427import std.stdio; import std.b ...
相关推荐
java读取qqWry.dat实现多IP同时查询源码,另外包含一个qqwry.dat文件实现查询指定IP所属地的共能源码。两份代码仅供参考。
// QQWry.Dat文件指针 var $fp; var $firstip; var $lastip; var $totalip; function getlong() { //unpack从二进制字符串对数据进行解包 //将读取的little-endian编码的4个字节转化为长整型数,fread安全...
2011最新版IP库,源文件和Excel格式。解压后直接导入到SQLServer就OK了。建立属于自己的IP库
给定IP地址,在qqwry.DAT中查询对应的IP地址信息。 VS2010+WIN7
qqwry.dat, 纯真IP地址数据库镜像,mirror of qqwry.dat.zip
最新纯真ip数据库qqwry.dat
qqwry.dat纯真IP 2023年9月更新 2023年最新版 相对于上个版本最新更新超过了100000个IP信息
PHP调用QQWry.Dat 实现IP归属地查询 PHP调用QQWry.Dat 实现IP归属地查询
qqwry.dat 纯真ip数据库 附在线升级工具 下载下来直接安装即可,ip数据库(qqwry.dat)在安装所在目录下
qqwry.dat 20190705更新的地址库 全球地址库 很全很新,纯真IP库 QQ IP数据库 纯真版收集了包括中国电信、中国移动、中国联通、长城宽带、聚友宽带等 ISP 的最新准确 IP 地址数据。包括 最全的网吧数据。希望能够通过...
QQWry.Dat ip库 收集了包括中国电信、中国网通、长城宽带、网通宽带、聚友宽带等 ISP 的最新准确 IP 地址数据。包括 最全的网吧数据。
qqwry.bat,纯真ip库,根据IP获取地区运营商,2019-9-12上传,精准无误
PHP 根据IP地址获取所在城市代码,通过调用纯真ip库qqwry.dat,判断所在城市。
lib-qqwry是一个高效查询纯真 IP 库(qqwry.dat)的模块。它是用 NodeJS 解析纯真 IP 库(QQwry.dat) ,支持 IP 段查询。为更好的字符转化效率,未使用iconv模块,直接使用gbk编码表文件。经过不断优化,相同环境下,单...
本工程用于演示如何借助qqwry.dat文件实现查询指定IP所属地的共能。 本工程编码方式:GBK
http://blog.csdn.net/thewindkee/article/details/70171711
QQWry.dat IP查询