资源简介
封装在一个类里的可以直接运行的ip数据库查询,可以直接在自己的程序中调用该类,并且带有最新的20110920QQwry.dat
代码片段和文件信息
#include “IPSearch.h“
IPSearch::IPSearch()
{
this->data = 0; //指向纯真IP数据库的指针
}
IPSearch::~IPSearch()
{
}
// 功能:将纯真IP数据库中的所有数据读入全局数组data
// 参数:file 文件字符串
// 返回值: 0 成功
int IPSearch::init(byte* file)
{
ulong fileSize; //文件长度
FILE* fp;
fp = fopen((char*)file“rb“);
if(fp == NULL)
return 1;
//获取文件长度
fseek(fp 0 SEEK_END);
fileSize = ftell(fp);
//将纯真IP数据库中的所有数据读入数组
data=(byte*)malloc(fileSize* sizeof(byte));
fseek(fp0SEEK_SET);
fread(data1fileSizefp);
if(data == NULL)
return 2;
fclose(fp);
fp=NULL;
//读取IP数据库文件头
dbheader.firstStartIpOffset=getInt32(&data[0]4);
dbheader.lastStartIpOffset=getInt32(&data[4]4);
//printf(“%ld %ld \n“dbheader.firstStartIpOffsetdbheader.lastStartIpOffset);
return 0;
}
// 功能:查询ipStr
IPLocation IPSearch::queryIp(byte* ipStr)
{
ulong ip;
ulong offset;
if(init((byte*)“QQWry.Dat“)==1)
{
printf(“QQWry.Dat 初始化失败!\n“);
}
ip=IpToLong(ipStr);
offset=getOffsetOfIp(ip);
//printf(“ip:%u offset: %u“ipoffset);
return getIPLocation(offset);
}
//功能: 二分法获得IP记录偏移量
//参数:ip 待查询ip
//返回值:相对于文件头的偏移量 (0 失败)
ulong IPSearch::getOffsetOfIp(ulong ip)
{
ulong low=0;
ulong high=(dbheader.lastStartIpOffset-dbheader.firstStartIpOffset)/7;
ulong endIpOff;
ulong mid;
while(low {
mid=(low+high)/2;
if(ip high=mid;
else
low=mid;
}
//printf(“\nlow:%ld \n“low);
if(ip>=getIpFromIndex(low&endIpOff)&&ip<=getIpFromRecord(endIpOff))
{
return endIpOff;
}
return 0L;
}
// 功能:从索引区获得IP地址
// 参数:left 索引
// 返回值:起始Ip地址
// endIpOff 该索引所对应的结束Ip偏移量
ulong IPSearch::getIpFromIndex(ulong leftulong* addr)
{
ulong leftOffset = dbheader.firstStartIpOffset + (left * 7L);
*addr=getInt32(&data[leftOffset+4]3);
return getInt32(&data[leftOffset]4);
}
// 功能:从记录区获得IP地址
ulong IPSearch::getIpFromRecord(ulong endIpOff)
{
return getInt32(&data[endIpOff]4);
}
// 功能:将字符数组转成一个整数
ulong IPSearch::getInt32(byte* bufint num)
{
ulong ret=0;
int i;
for(i=0;i {
ret+=(buf[i]<<(8*i));
}
return ret ;
}
//将ip从字符串形式转化为一个长整数
ulong IPSearch::IpToLong(byte* ipStr)
{
byte* p=ipStr;
byte ch;
int i=0;
int shift=24;
ulong ret=0temp;
for(i=0;i<4;i++)
{
temp=0;
while((ch=*p++)!=‘.‘ && ch)
temp=temp*10+(ch -‘0‘);
ret+=(temp< shift-=8;
}
if(i!=4)
return -1;
return ret;
}
// 功能:给定一个ip国家地区记录的偏移,返回一个IPLocation结构
// 参数: offset 国家记录的起始偏移
// 返回值:IPLocation对象
IPLocation IPSearch::getIPLocation(ulong offset)
{
byte flag_char;
// 跳过4字节ip读取随后字节判断是否为标志字节
flag_char=data[offset+4];
if(flag_char == REDIRECT_MODE_1) {
// 读取国家偏移(3个字节)
ulong countryOffset=getInt32(&data[offset+5]3);
// 再检查一次标志字节,因为这个时候这个地方仍然可能是个重定向
flag_char=data[countryOffset];
if(flag_char == REDIRECT_MODE_2) {
// 读取国家偏移
int temp;
temp=getInt3
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 36352 2011-10-10 14:33 ip_c_class\Debug\ip_c_class.exe
文件 352768 2011-10-10 14:33 ip_c_class\Debug\ip_c_class.ilk
文件 584704 2011-10-10 14:33 ip_c_class\Debug\ip_c_class.pdb
文件 6914 2011-10-10 14:33 ip_c_class\ip_c_class\Debug\BuildLog.htm
文件 17571 2011-10-10 14:33 ip_c_class\ip_c_class\Debug\IPSearch.obj
文件 663 2011-10-10 13:24 ip_c_class\ip_c_class\Debug\ip_c_class.exe.em
文件 728 2011-10-10 13:24 ip_c_class\ip_c_class\Debug\ip_c_class.exe.em
文件 621 2011-10-10 14:33 ip_c_class\ip_c_class\Debug\ip_c_class.exe.intermediate.manifest
文件 67 2011-10-10 14:33 ip_c_class\ip_c_class\Debug\mt.dep
文件 25513 2011-10-10 14:33 ip_c_class\ip_c_class\Debug\test.obj
文件 191488 2011-10-10 14:33 ip_c_class\ip_c_class\Debug\vc90.idb
文件 217088 2011-10-10 14:33 ip_c_class\ip_c_class\Debug\vc90.pdb
文件 4726 2011-10-10 14:28 ip_c_class\ip_c_class\IPSearch.cpp
文件 2037 2011-10-10 14:30 ip_c_class\ip_c_class\IPSearch.h
文件 4048 2011-10-10 11:15 ip_c_class\ip_c_class\ip_c_class.vcproj
文件 1427 2011-10-10 14:34 ip_c_class\ip_c_class\ip_c_class.vcproj.PC-201108081419.Administrator.user
文件 9151777 2011-09-20 19:28 ip_c_class\ip_c_class\QQWry.Dat
文件 404 2011-10-10 14:32 ip_c_class\ip_c_class\test.cpp
文件 1567744 2011-10-10 14:34 ip_c_class\ip_c_class.ncb
文件 896 2011-10-10 11:09 ip_c_class\ip_c_class.sln
..A..H. 14336 2011-10-10 14:34 ip_c_class\ip_c_class.suo
目录 0 2011-10-10 14:33 ip_c_class\ip_c_class\Debug
目录 0 2011-10-10 14:30 ip_c_class\Debug
目录 0 2011-10-10 14:32 ip_c_class\ip_c_class
目录 0 2011-10-10 11:54 ip_c_class
----------- --------- ---------- ----- ----
12181872 25
相关资源
- 用过最好用的C/C++/STLchm格式的帮助文
- 吃豆人C/c++实现
- C/C++文件系统树状结构
- 人事管理系统(MFCC++实现)
- C/C++深层探索 PDF清晰版
- Borland C++ 5.5 编译器
- uml状态图的实用C/C++设计 中英文非扫
- 哈夫曼编码压缩文件,c/c++课程设计
- 谭浩强C语言程序设计第三版中文版
- C/C++使用ODBC操作SQL server数据库
- C/C++使用ODBC连接SQL server数据库完整流
- C++基于UDP的控制台局域网聊天程序
- netcdf 4.4.1 c/c++类库windows64位绿色版
- 西北工业大学C/C++程序设计大作业包含
- 《C/C++中国象棋程序入门与提高》源代
- C/C++:Windows编程—调用DLL程序的2种方
- C/C++帮助文档2019版4月出品的超级详细
- 最全 C/C++ API文档
- C++Primer中文版(第4版)
- 猫脸变换算法(Arnold)的简单实现C
- c++课程设计模拟计算器含源代码、文
- C/C++标准库源代码
- RFIDC/C++门禁系统 RFID源码
- C/C++数据结构_随机10000个数:排序~8大
- 特征码搜索基址 c/c++源代码
- LeetCode题解 C/C++版
- 课程设计源码.zip
- C/C++参考手册大全5本集合.chm
- 猜词游戏 C/C++程序设计
- eclipse c/c++ 自动补全,auto activation,自
评论
共有 条评论