437 lines
8.4 KiB
C++
437 lines
8.4 KiB
C++
/*********************************************************************
|
|
* SEU_QQwry.cpp
|
|
*
|
|
* 楚茗收集整理
|
|
*
|
|
* 说明:纯真IP数据库 QQWry.dat的操作类
|
|
*
|
|
* 部分代码来源于网络,你可以随意使用,传播或修改.但是不可用于商业用途
|
|
*********************************************************************/
|
|
|
|
#include "..\stdafx.h"
|
|
#include "SEU_QQwry.h"
|
|
|
|
#ifdef _DEBUG
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[]=__FILE__;
|
|
#define new DEBUG_NEW
|
|
#endif
|
|
|
|
//////////////////////////////////////////////////////////////////////
|
|
// Construction/Destruction
|
|
//////////////////////////////////////////////////////////////////////
|
|
SEU_QQwry::SEU_QQwry()
|
|
{
|
|
}
|
|
|
|
SEU_QQwry::~SEU_QQwry()
|
|
{
|
|
CloseQQwry();
|
|
}
|
|
|
|
/*********************************************************************
|
|
* OpenQQwry(CString szFileName)
|
|
*
|
|
* 用来打开IP数据库文件的函数函数
|
|
*
|
|
* 说明:一般打开QQWry.dat文件
|
|
*********************************************************************/
|
|
bool SEU_QQwry::OpenQQwry(CString szFileName)
|
|
{
|
|
if(!m_file.Open(szFileName,CFile::modeRead|CFile::typeBinary|CFile::shareDenyNone))
|
|
return false;
|
|
else
|
|
return true;
|
|
}
|
|
|
|
void SEU_QQwry::CloseQQwry()
|
|
{
|
|
if(m_bOpen)m_file.Close();
|
|
}
|
|
|
|
bool SEU_QQwry::GetBE()
|
|
{
|
|
if(!m_bOpen)return false;
|
|
m_file.Seek(0,CFile::begin);
|
|
if(m_file.Read(&m_be,sizeof(BE))>0)
|
|
return true;
|
|
else
|
|
return false;
|
|
}
|
|
|
|
/*********************************************************************
|
|
* GetStartIPInfo(int iIndex)
|
|
*
|
|
* 根据输入IP的索引得到该段IP所属的IP段的起始IP
|
|
*
|
|
* 说明:
|
|
*********************************************************************/
|
|
int SEU_QQwry::GetStartIPInfo(int iIndex)
|
|
{
|
|
BYTE buf[MAXBUF];
|
|
int ioff;
|
|
if(!m_bOpen) return 0;
|
|
ioff=m_be.uBOff+iIndex*7;
|
|
if(ioff>m_be.uEOff) return 0;
|
|
m_file.Seek(m_be.uBOff+iIndex*7,CFile::begin);
|
|
m_file.Read(&m_ipoff,sizeof(IPOFF));
|
|
ioff=(m_ipoff.off1+m_ipoff.off2*256+m_ipoff.off3*256*256);
|
|
m_file.Seek(ioff,CFile::begin);
|
|
m_file.Read(&m_ei,sizeof(EndInfo));
|
|
|
|
if(m_ei.buf[0]!=1 && m_ei.buf[0]!=2)
|
|
{
|
|
m_ei.bMode=1;//没有跳
|
|
for(int i=0;i<MAXBUF;i++)
|
|
{
|
|
if(m_ei.buf[i]==0)
|
|
{
|
|
if(m_ei.buf[i+1]==2)
|
|
{
|
|
m_ei.bMode=2;//Local 跳
|
|
m_ei.offset1=m_ei.buf[i+2]+
|
|
m_ei.buf[i+3]*256+
|
|
m_ei.buf[i+4]*256*256;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
else if(m_ei.buf[0]==2)
|
|
{
|
|
m_ei.bMode=3;//Country 跳 local不跳
|
|
m_ei.offset1=m_ei.buf[1]+m_ei.buf[2]*256+m_ei.buf[3]*256*256;
|
|
if(m_ei.buf[4]!=2)
|
|
{
|
|
m_ei.bMode=3;
|
|
}
|
|
else
|
|
{
|
|
m_ei.bMode=4;//Country跳 local跳
|
|
m_ei.offset2=m_ei.buf[5]+m_ei.buf[6]*256+m_ei.buf[7]*256*256;
|
|
}
|
|
}
|
|
else if(m_ei.buf[0]==1)
|
|
{
|
|
m_ei.offset1=m_ei.buf[1]+m_ei.buf[2]*256+m_ei.buf[3]*256*256;
|
|
m_file.Seek(m_ei.offset1,CFile::begin);
|
|
m_file.Read(buf,MAXBUF);
|
|
memcpy(m_ei.buf,buf,MAXBUF);
|
|
m_ei.bMode=0;
|
|
if(m_ei.buf[0]!=2)
|
|
{
|
|
for(int i=0;i<MAXBUF;i++)
|
|
{
|
|
if(m_ei.buf[i]==0)
|
|
{
|
|
if(m_ei.buf[i+1]!=2)
|
|
{
|
|
m_ei.bMode=5;//1 没有跳
|
|
}
|
|
else
|
|
{
|
|
m_ei.bMode=6;//1 Country不跳 Local 跳
|
|
m_ei.offset2=m_ei.buf[i+2]+
|
|
m_ei.buf[i+3]*256+
|
|
m_ei.buf[i+4]*256*256;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
|
|
if(m_ei.buf[4]!=2)
|
|
{
|
|
m_ei.bMode=7;// 1 Country跳 Local不跳
|
|
m_ei.offset2=m_ei.buf[1]+
|
|
m_ei.buf[2]*256+
|
|
m_ei.buf[3]*256*256;
|
|
|
|
}
|
|
else
|
|
{
|
|
m_ei.bMode=8;// 1 Country跳 Local跳
|
|
m_ei.offset1=m_ei.buf[1]+
|
|
m_ei.buf[2]*256+
|
|
m_ei.buf[3]*256*256;
|
|
m_ei.offset2=m_ei.buf[5]+
|
|
m_ei.buf[6]*256+
|
|
m_ei.buf[7]*256*256;
|
|
}
|
|
}
|
|
}
|
|
return ioff;
|
|
}
|
|
|
|
int SEU_QQwry::GetRecordCount(void)//得到总的IP记录数
|
|
{
|
|
if(!m_bOpen) return 0;
|
|
if((m_be.uEOff-m_be.uBOff)<0) return 0;
|
|
return (m_be.uEOff-m_be.uBOff)/7+1;
|
|
}
|
|
|
|
CString SEU_QQwry::GetStr(int ioffset)//根据位置读信息
|
|
{
|
|
if(ioffset>m_be.uEOff) return "";
|
|
BYTE ch;
|
|
CString buf="";
|
|
m_file.Seek(ioffset,CFile::begin);
|
|
int i=0;
|
|
while(1)
|
|
{
|
|
m_file.Read(&ch,1);
|
|
if(ch==0)
|
|
break;
|
|
buf+=ch;
|
|
i++;
|
|
if(i>50)break;
|
|
}
|
|
return buf;
|
|
}
|
|
|
|
|
|
/*********************************************************************
|
|
* GetCountryLocal(int index)
|
|
*
|
|
* 根据索引得到地址
|
|
*
|
|
* 说明:
|
|
*********************************************************************/
|
|
CString SEU_QQwry::GetCountryLocal(int index)
|
|
{
|
|
if(index<0 || index>GetRecordCount()-1)
|
|
return "没有查到相关信息";
|
|
return GetCountryLocal(m_ei.bMode,GetStartIPInfo(index)+4);
|
|
}
|
|
|
|
CString SEU_QQwry::GetCountryLocal(BYTE bMode,int ioffset)
|
|
{
|
|
CString buf="";
|
|
if(bMode==1)//X 没有跳
|
|
{
|
|
buf=GetStr(ioffset);
|
|
buf+=" ";
|
|
buf+=GetStr();
|
|
}
|
|
if(bMode==2)//X Country不跳 Local 跳
|
|
{
|
|
buf=GetStr(ioffset);
|
|
buf+=" ";
|
|
buf+=GetStr(m_ei.offset1);
|
|
}
|
|
if(bMode==3)//2 Country跳 local不跳
|
|
{
|
|
buf=GetStr(m_ei.offset1);
|
|
buf+=" ";
|
|
buf+=GetStr(ioffset+4);
|
|
}
|
|
|
|
if(bMode==4)//2 Country跳 local跳
|
|
{
|
|
buf=GetStr(m_ei.offset1);
|
|
buf+=" ";
|
|
buf+=GetStr(m_ei.offset2);
|
|
}
|
|
|
|
if(bMode==5)//1 没有跳
|
|
{
|
|
buf=GetStr(m_ei.offset1);
|
|
buf+=" ";
|
|
buf+=GetStr();
|
|
}
|
|
|
|
if(bMode==6)//1 Country不跳 Local 跳
|
|
{
|
|
buf=GetStr(m_ei.offset1);
|
|
buf+=" ";
|
|
buf+=GetStr(m_ei.offset2);
|
|
}
|
|
if(bMode==7)//1 Country跳 Local 不跳
|
|
{
|
|
buf=GetStr(m_ei.offset2);
|
|
buf+=" ";
|
|
buf+=GetStr(m_ei.offset1+4);
|
|
}
|
|
if(bMode==8)//1 Country跳 Local跳
|
|
{
|
|
buf=GetStr(m_ei.offset1);
|
|
buf+=" ";
|
|
buf+=GetStr(m_ei.offset2);
|
|
}
|
|
return buf;
|
|
}
|
|
|
|
CString SEU_QQwry::GetStr()
|
|
{
|
|
BYTE ch;
|
|
CString buf="";
|
|
int i=0;
|
|
while(1)
|
|
{
|
|
m_file.Read(&ch,1);
|
|
if(ch==0)
|
|
break;
|
|
buf+=ch;
|
|
i++;
|
|
if(i>50)break;
|
|
}
|
|
return buf;
|
|
}
|
|
|
|
/*********************************************************************
|
|
* SaveToFile()
|
|
*
|
|
* 保存所有信息到文件
|
|
*
|
|
* 说明:
|
|
*********************************************************************/
|
|
void SEU_QQwry::SaveToFile(CString Name)
|
|
{
|
|
CString str1,str2;
|
|
DWORD dwBytesWrite;
|
|
HANDLE hFile = INVALID_HANDLE_VALUE;
|
|
hFile = CreateFile(Name+".txt", GENERIC_WRITE, FILE_SHARE_WRITE, NULL,
|
|
CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
|
|
if (hFile == INVALID_HANDLE_VALUE)
|
|
return;
|
|
int ioff;
|
|
m_buf.Format("Total %d\r\n",GetRecordCount());//得到总记录
|
|
WriteFile(hFile, m_buf.GetBuffer(0), m_buf.GetLength(), &dwBytesWrite, NULL);
|
|
|
|
for(m_i=0;m_i<GetRecordCount();m_i++)
|
|
{
|
|
ioff=GetStartIPInfo(m_i);//得到开始的IP信息
|
|
str1.Format("%d.%d.%d.%d",m_ipoff.b3,m_ipoff.b2,m_ipoff.b1,m_ipoff.b0);//开始IP
|
|
str2.Format("%d.%d.%d.%d",m_ei.b3,m_ei.b2,m_ei.b1,m_ei.b0);//结束IP
|
|
m_buf.Format("%-15s %-15s %s\r\n",
|
|
str1,str2,GetCountryLocal(m_ei.bMode,ioff+4));
|
|
WriteFile(hFile, m_buf.GetBuffer(0), m_buf.GetLength(), &dwBytesWrite, NULL);
|
|
}
|
|
CloseHandle(hFile);
|
|
}
|
|
|
|
|
|
/*********************************************************************
|
|
* IPtoAdd(CString szIP)
|
|
*
|
|
* 根据IP找到地址
|
|
*
|
|
* 说明:
|
|
*********************************************************************/
|
|
CString SEU_QQwry::IPtoAdd(CString szIP)
|
|
{
|
|
if(szIP=="")return "请输入IP地址";
|
|
return GetCountryLocal(GetIndex(szIP));
|
|
}
|
|
|
|
|
|
/*********************************************************************
|
|
* GetIndex(CString szIP)
|
|
*
|
|
* 根据IP找到索引
|
|
*
|
|
* 说明:
|
|
*********************************************************************/
|
|
int SEU_QQwry::GetIndex(CString szIP)
|
|
{
|
|
int index=-1;
|
|
DWORD dwInputIP;
|
|
DWORD dwStartIP;
|
|
dwInputIP=IPtoDWORD(szIP);
|
|
//利用半跳方法速度快一些
|
|
int iT;
|
|
int iB,iE;
|
|
iB=0;
|
|
iE=GetRecordCount()-1;
|
|
iT=iE/2;
|
|
|
|
while(iB<iE)
|
|
{
|
|
dwStartIP=GetSIP(iT);
|
|
if(dwInputIP==dwStartIP)
|
|
{
|
|
index =iT;
|
|
break;
|
|
}
|
|
if((iE-iB)<=1)
|
|
{
|
|
for(int i=iB;i<=iE;i++)
|
|
{
|
|
dwStartIP=GetSIP(i);
|
|
if(dwStartIP<=dwInputIP && dwInputIP<=m_dwLastIP)
|
|
{
|
|
index=i;
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
|
|
if(dwInputIP>dwStartIP)
|
|
{
|
|
iB=iT;
|
|
}
|
|
else
|
|
{
|
|
iE=iT;
|
|
}
|
|
iT=iB+(iE-iB)/2;
|
|
}
|
|
return index;
|
|
}
|
|
//根据索引得到DWORD类型的IP,GetIndex(CString szIP)函数中用到
|
|
DWORD SEU_QQwry::GetSIP(int index)
|
|
{
|
|
DWORD ip;
|
|
BYTE b[3];
|
|
int ioff;
|
|
if(!m_bOpen)return -1;
|
|
if(index>GetRecordCount()-1)return -1;
|
|
if(index<0)return -1;
|
|
ioff=m_be.uBOff+index*7;
|
|
m_file.Seek(ioff,CFile::begin);
|
|
m_file.Read(&ip,4);
|
|
m_file.Read(b,3);
|
|
ioff=b[0]+b[1]*256+b[2]*256*256;
|
|
m_file.Seek(ioff,CFile::begin);
|
|
m_file.Read(&m_dwLastIP,4);
|
|
return ip;
|
|
}
|
|
//转CString为DWORD,GetIndex(CString szIP)函数中用到
|
|
DWORD SEU_QQwry::IPtoDWORD(CString szIP)
|
|
{
|
|
DWORD iIP;
|
|
BYTE b[4];
|
|
CString szTemp;
|
|
char ch;
|
|
int iLen;
|
|
int iXB;
|
|
szIP+=".";
|
|
memset(b,0,4);
|
|
iLen=szIP.GetLength();
|
|
iXB=0;
|
|
iIP=0;
|
|
for(int i=0;i<iLen;i++)
|
|
{
|
|
ch=szIP.GetAt(i);
|
|
szTemp+=ch;
|
|
if(ch=='.')
|
|
{
|
|
b[iXB]=atoi(szTemp);
|
|
szTemp="";
|
|
iXB++;
|
|
}
|
|
}
|
|
iIP=b[0]*256*256*256+b[1]*256*256+b[2]*256+b[3];
|
|
return iIP;
|
|
}
|
|
/*************************************************************/
|
|
|
|
void SEU_QQwry::SetPath(CString path)
|
|
{
|
|
m_bOpen=OpenQQwry(path);
|
|
GetBE();
|
|
}
|