根据IP地址查询全球物理地址操作类源码共享大家

关于qqwry.dat数据的格式我就不详细分析了。

网上的教程比较多。。调用很方便。 文件也提供给大家

大小不到9M. 

下载地址链接  //解压密码  nidongde2013

//类文件wry.h   header

//////////////////////////////////////////////////////////////////////
#include <windows.h>

#define MAXBUF 50 
typedef struct _tagEndInfo
{
	BYTE b0;
	BYTE b1;
	BYTE b2;
	BYTE b3;
	BYTE buf[MAXBUF];
	BYTE bMode;
	int offset1;
	int offset2;
}EndInfo,PEndInfo;

typedef struct _tagIPOFF
{
	BYTE b0;
	BYTE b1;
	BYTE b2;
	BYTE b3;
	BYTE off1;
	BYTE off2;
	BYTE off3;
}IPOFF,*PIPOFF;

typedef struct _tagBE
{
	int uBOff;
	int uEOff;
}BE,*PBE;

class Data_QQwry  
{
public:
	DWORD m_dwLastIP;
	int m_i;
	BE m_be;
	IPOFF m_ipoff;
	EndInfo m_ei;

	Data_QQwry();
	virtual ~Data_QQwry();
	CHAR *  IPAddress2GeoAddress(CHAR* szIP);
	CHAR *  GetCountryLocal(int index);
	CHAR *  GetStr(void);
	CHAR *  GetCountryLocal(BYTE bMode,int ioffset);
	CHAR *  GetStr(int ioffset);

	DWORD   GetSIP(int index);
	DWORD   IPAddress2DWORD(CHAR* szIP);	
	int     GetIndex(CHAR* szIP);
	int     GetRecordCount(void);
	int     GetStartIPInfo(int iIndex);
	BOOL    GetBE(void);
	BOOL    OpenQQwry(CHAR * pchszFileName);
	void    CloseQQwry(void);

private:
	CHAR * pchStrQQwryFile;
	HANDLE m_hFile;
	DWORD m_dwReadedBytes;
};
// 

//类文件  cpp 


/////////////////////////////////////////////////////////////////////
#include "wry.h"

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

Data_QQwry::Data_QQwry()
{
	m_dwReadedBytes=0;
	m_hFile=NULL;
	pchStrQQwryFile = "QQwry.dat";
    OpenQQwry(pchStrQQwryFile);
	GetBE();
}

Data_QQwry::~Data_QQwry()
{
	CloseQQwry();
}

BOOL Data_QQwry::OpenQQwry(CHAR * pchszFileName)
{

	m_hFile=CreateFile(pchszFileName,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
	if (m_hFile==INVALID_HANDLE_VALUE)
	return FALSE;
	else
	return TRUE;
}

void Data_QQwry::CloseQQwry()
{
	if(m_hFile!=INVALID_HANDLE_VALUE)
		CloseHandle(m_hFile);
}

BOOL Data_QQwry::GetBE()
{
	if(!m_hFile)
		return FALSE;
	ReadFile(m_hFile,&m_be,sizeof(BE),&m_dwReadedBytes,NULL);
	if (m_dwReadedBytes>0)
	return TRUE;
	else 
	return FALSE;
	
}

int Data_QQwry::GetStartIPInfo(int iIndex)
{
	BYTE buf[MAXBUF];
	memset(buf,0,MAXBUF);
	int ioff;
	ioff=m_be.uBOff+iIndex*7;
	if(ioff>m_be.uEOff) 
		return 0;
	SetFilePointer(m_hFile,m_be.uBOff+iIndex*7,NULL,FILE_BEGIN);
	ReadFile(m_hFile,&m_ipoff,sizeof(IPOFF),&m_dwReadedBytes,NULL);
	ioff=(m_ipoff.off1+m_ipoff.off2*256+m_ipoff.off3*256*256);
	SetFilePointer(m_hFile,ioff,NULL,FILE_BEGIN);
	ReadFile(m_hFile,&m_ei,sizeof(EndInfo),&m_dwReadedBytes,NULL);

	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;
					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;//
		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;//
			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;
		SetFilePointer(m_hFile,m_ei.offset1,NULL,FILE_BEGIN);
		ReadFile(m_hFile,buf,MAXBUF,&m_dwReadedBytes,NULL);
		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;
					}
					else
					{
						m_ei.bMode=6;
						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;// 
				m_ei.offset2=m_ei.buf[1]+
							m_ei.buf[2]*256+
							m_ei.buf[3]*256*256;

			}
			else
			{
				m_ei.bMode=8;// 
				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 Data_QQwry::GetRecordCount(void)
{
	if(!m_hFile)
		return 0;
	if((m_be.uEOff-m_be.uBOff)<0)
		return 0;

	return (m_be.uEOff-m_be.uBOff)/7+1;
}

CHAR* Data_QQwry::GetStr(int ioffset)
{
	if(ioffset>m_be.uEOff) 
		return "";
	BYTE ch=0;
	CHAR * buf=new CHAR[MAXBUF];
	memset(buf,0,MAXBUF);
	SetFilePointer(m_hFile,ioffset,NULL,FILE_BEGIN);
	int i=0;
	while(TRUE)
	{
		ReadFile(m_hFile,&ch,1,&m_dwReadedBytes,NULL);
		if(ch==0)
			break;
		buf[i]=ch;
		i++;
		if(i>50)
			break;
	}
	return buf;
}
CHAR * Data_QQwry::GetCountryLocal(int index)
{

	if(index<0 || index>GetRecordCount()-1)
		return "没有查到";
	return GetCountryLocal(m_ei.bMode,GetStartIPInfo(index)+4);
}
CHAR* Data_QQwry::GetCountryLocal(BYTE bMode,int ioffset)
{
	CHAR* pbuf=NULL;
	if(bMode==1)//X 
	{
		pbuf=GetStr(ioffset);
		lstrcat(pbuf," ");
		lstrcat(pbuf,GetStr());
	}
	if(bMode==2)//
	{
		pbuf=GetStr(ioffset);
		lstrcat(pbuf," ");
		lstrcat(pbuf,GetStr(m_ei.offset1));
	}
	if(bMode==3)//2
	{
		pbuf=GetStr(m_ei.offset1);
		lstrcat(pbuf," ");
		lstrcat(pbuf,GetStr(ioffset+4));
	}

	if(bMode==4)//
	{
		pbuf=GetStr(m_ei.offset1);
		lstrcat(pbuf," ");
		lstrcat(pbuf,GetStr(m_ei.offset2));
	}

	if(bMode==5)//
	{
		pbuf=GetStr(m_ei.offset1);
		lstrcat(pbuf," ");
		lstrcat(pbuf,GetStr());
	}

	if(bMode==6)
	{
		pbuf=GetStr(m_ei.offset1);
		lstrcat(pbuf," ");
		lstrcat(pbuf,GetStr(m_ei.offset2));
	}
	if(bMode==7)
	{
		pbuf=GetStr(m_ei.offset2);
		lstrcat(pbuf," ");
		lstrcat(pbuf,GetStr(m_ei.offset1+4));
	}
	if(bMode==8)
	{
		pbuf=GetStr(m_ei.offset1);
		lstrcat(pbuf," ");
		lstrcat(pbuf,GetStr(m_ei.offset2));
	}
	return pbuf;
}

CHAR * Data_QQwry::GetStr()
{
	BYTE ch;
	CHAR *buf=new CHAR[MAXBUF];
	memset(buf,0,MAXBUF);
	int i=0;
	while(TRUE)
	{ 
		ReadFile(m_hFile,&ch,1,&m_dwReadedBytes,NULL);
		if(ch==0)
			break;
		buf[i]=ch;
		i++;
		if(i>50)
			break;
	}
	return buf;
}

CHAR* Data_QQwry::IPAddress2GeoAddress(CHAR* szIP)
{
	if(szIP==NULL)
		return "请输入IP地址";

	return GetCountryLocal(GetIndex(szIP));
}

int Data_QQwry::GetIndex(CHAR* szIP)
{
	int index=-1;
	DWORD dwInputIP;
	DWORD dwStartIP;
	dwInputIP=IPAddress2DWORD(szIP);

	int iT;
	int iB,iE;
	iB=0;
	iE=GetRecordCount()-1;//
	iT=iE/2;
	
	while(iB<iE)
	{
		dwStartIP=GetSIP(iT);//0k
		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 Data_QQwry::GetSIP(int index)
{
	DWORD ip;
	BYTE b[3];
	int ioff;
	if(!m_hFile)
		return -1;
	if(index>GetRecordCount()-1)
		return -1;
	if(index<0)
		return -1;
	ioff=m_be.uBOff+index*7;
	//
	SetFilePointer(m_hFile,ioff,NULL,FILE_BEGIN);
	ReadFile(m_hFile,&ip,4,&m_dwReadedBytes,NULL);
	ReadFile(m_hFile,b,3,&m_dwReadedBytes,NULL);
	ioff=b[0]+b[1]*256+b[2]*256*256;
	SetFilePointer(m_hFile,ioff,NULL,FILE_BEGIN);
	ReadFile(m_hFile,&m_dwLastIP,4,&m_dwReadedBytes,NULL);
	return ip;
}

DWORD Data_QQwry::IPAddress2DWORD(CHAR* szIP)
{
	DWORD iIP=0;
	BYTE b[4]={0};
	CHAR szTemp[5];
	memset(szTemp,0,5);
	BYTE ch;
	int iLen;
	int iXB;
	memset(b,0,4);
	iLen=lstrlen(szIP);
	szIP[iLen]='.';
	iXB=0;
	iIP=0;
	int nIndex=0;
	for(int i=0;i<iLen+1;i++)
	{
		ch=szIP[i];
		szTemp[nIndex++]=ch;
		if(ch=='.')
		{
			b[iXB]=atoi(szTemp);
			memset(szTemp,0,5);
			iXB++;
			nIndex=0;
		}
	}
	iIP=b[0]*256*256*256+b[1]*256*256+b[2]*256+b[3];
	return iIP;
}

//main cpp 
#include "wry.h"
int _tmain(int argc, _TCHAR* argv[])
{
	Data_QQwry *DQ = new Data_QQwry;
	CHAR * pChstrAddress=new CHAR[50];
	CHAR * pChStr=new CHAR[50];
	memset(pChStr,0,50);
	lstrcpy(pChStr,"127.0.0.1");
	CHAR *pChGEo = DQ->IPAddress2GeoAddress(pChStr);
	lstrcpy(pChstrAddress,pChGEo);
	delete DQ;
	delete[]pChStr;
	delete[]pChstrAddress;
	return 1;
}

//test   返回  本机地址

你可能感兴趣的:(根据IP地址查询全球物理地址操作类源码共享大家)