ver1
#include <iostream>
#include <fstream>
#include <string>
#include <WINSOCK2.H>
using namespace std;
#pragma comment(lib, "ws2_32.lib")
typedef unsigned long uLong;
typedef unsigned char uChar;
typedef struct _QQWryHead
{
uLong uBindex;
uLong uEindex;
}QQWryHead, *PQQWryHead;
typedef union _QQWryIP
{
uLong uip;
uChar addr[4];
}QQWryIP, *PQQWryIP;
typedef struct _QQWryIndex
{
QQWryIP ip;
QQWryIP point;
}QQWryIndex;
typedef struct _QQWryInfo
{
QQWryIP ip_end;
QQWryIP mod;
}QQWryInfo;
class CQQWry
{
private:
ifstream m_fin;
QQWryHead m_head;
QQWryIP m_ip; //要搜索的ip
QQWryIP m_ipSearch; //当前读取到的ip信息
QQWryIP m_ipSearchEnd; //当前读取到的结束ip信息
QQWryIndex m_index; //当前读取到的索引
QQWryInfo m_info; //当前读取到的ip信息
uLong uBindex;
uLong uEindex;
uLong uMindex;
uLong uIndexCount; //索引的条数
uLong uResult; //搜索到的结果索引
///
bool init();
int readInfo(int index);
int readEndInfo();
public:
CQQWry();
~CQQWry(){};
int search(string ip);
void show();
};
void CQQWry::show()
{
cout << uResult <<endl;
}
CQQWry::CQQWry():uBindex(0), uEindex(0), uMindex(0), uIndexCount(0), uResult(0)
{
memset(&m_head, 0, sizeof(m_head));
memset(&m_ip, 0, sizeof(m_ip));
memset(&m_ipSearch, 0, sizeof(m_ipSearch));
memset(&m_ipSearchEnd, 0, sizeof(m_ipSearchEnd));
memset(&m_index, 0, sizeof(m_index));
memset(&m_info, 0, sizeof(m_info));
}
bool CQQWry::init()
{
m_fin.clear();
m_fin.seekg(0, ios::beg);
m_fin.read((char*)&m_head, sizeof(m_head));
if(m_fin.gcount() != sizeof(m_head))
return false;
return true;
}
int CQQWry::readInfo(int index)
{
m_fin.clear();
m_fin.seekg(m_head.uBindex + 7 * index, ios::beg);
m_fin.read((char*)&m_index, sizeof(m_index));
if(m_fin.gcount() <= 7)
return 0;
m_ipSearch.uip = m_index.ip.uip;
return 1;
}
int CQQWry::readEndInfo()
{
m_fin.clear();
m_fin.seekg((m_index.point.uip >> 8), ios::beg);
m_fin.read((char*)&m_info, sizeof(m_info));
if(m_fin.gcount() <= 5)
return 0;
m_ipSearchEnd.uip = m_info.ip_end.uip;
return 1;
}
int CQQWry::search(string ip)
{
m_fin.open("QQWry.dat", ios::in | ios::binary);
if(!m_fin.is_open())
return -1;
if(!init())
{
m_fin.close();
return -1;
}
m_ip.uip = inet_addr(ip.c_str());
in_addr a;
//memcpy(&m_ip, ip.c_str(), ip.length());
swap(m_ip.addr[0], m_ip.addr[3]);
swap(m_ip.addr[1], m_ip.addr[2]);
memcpy(&a, &m_ip.uip, 4);
cout << inet_ntoa(a) <<endl;
uBindex = 0;
uEindex = (m_head.uEindex - m_head.uBindex) / 7;
uMindex = (uEindex + uBindex) / 2;
while(uBindex < uEindex)
{
readInfo(uMindex);
//memcpy(&a, &m_ipSearch.uip, 4);
//cout << inet_ntoa(a) <<endl;
cout << m_ip.uip << "\t\t" << m_ipSearch.uip <<endl;
if(m_ip.uip == m_ipSearch.uip)
{
uResult = uMindex;
return 1; //搜索到了这个ip
}
else if(uEindex - uBindex <= 1)
{
for(uLong u = uBindex; u <= uEindex; ++u)
{
readInfo(u);
readEndInfo();
if(m_ipSearch.uip < m_ip.uip && m_ip.uip <= m_ipSearchEnd.uip)
{
uResult = u;
return 1;
}
}
break;
}
else
{
if(m_ip.uip > m_ipSearch.uip)
uBindex = uMindex;
else
uEindex = uMindex;
uMindex = (uEindex + uBindex) / 2;
}
}
cout << "没找到" <<endl;
m_fin.close();
return 0;
}
int main(int argc, char* argv[])
{
CQQWry cqqwry;
if(cqqwry.search("1.1.1.1"))
cqqwry.show();
return 0;
}
ver2
#include <iostream>
#include <fstream>
#include <string>
#include <WINSOCK2.H>
using namespace std;
#pragma comment(lib, "ws2_32.lib")
typedef unsigned long uLong;
typedef unsigned char uChar;
typedef struct _QQWryHead
{
uLong uBindex;
uLong uEindex;
}QQWryHead, *PQQWryHead;
typedef union _QQWryIP
{
uLong uip;
uChar addr[4];
}QQWryIP, *PQQWryIP;
typedef struct _QQWryIndex
{
QQWryIP ip;
QQWryIP point;
}QQWryIndex;
typedef struct _QQWryInfo
{
QQWryIP ip_end;
QQWryIP mod;
}QQWryInfo;
class CQQWry
{
private:
ifstream m_fin;
QQWryHead m_head;
QQWryIP m_ip;
QQWryIP m_ipSearch;
QQWryIP m_ipSearchEnd;
QQWryIndex m_index;
QQWryInfo m_info;
uLong uBindex;
uLong uEindex;
uLong uMindex;
uLong uIndexCount;
uLong uResult;
///
bool init();
int readInfo(int index);
int readEndInfo();
public:
CQQWry();
~CQQWry(){};
int search(string ip);
void show();
};
void CQQWry::show()
{
cout << uResult <<endl;
}
CQQWry::CQQWry():uBindex(0), uEindex(0), uMindex(0), uIndexCount(0), uResult(0)
{
memset(&m_head, 0, sizeof(m_head));
memset(&m_ip, 0, sizeof(m_ip));
memset(&m_ipSearch, 0, sizeof(m_ipSearch));
memset(&m_ipSearchEnd, 0, sizeof(m_ipSearchEnd));
memset(&m_index, 0, sizeof(m_index));
memset(&m_info, 0, sizeof(m_info));
}
bool CQQWry::init()
{
m_fin.clear();
m_fin.seekg(0, ios::beg);
m_fin.read((char*)&m_head, sizeof(m_head));
if(m_fin.gcount() != sizeof(m_head))
return false;
return true;
}
int CQQWry::readInfo(int index)
{
m_fin.clear();
m_fin.seekg(m_head.uBindex + 7 * index, ios::beg);
m_fin.read((char*)&m_index, sizeof(m_index));
if(m_fin.gcount() <= 7)
return 0;
m_ipSearch.uip = m_index.ip.uip;
return 1;
}
int CQQWry::readEndInfo()
{
m_fin.clear();
uLong off = 0;
off = m_index.point.addr[0];
off += m_index.point.addr[1] << 8;
off += m_index.point.addr[2] << 16;
m_fin.seekg(off, ios::beg);
m_fin.read((char*)&m_info, sizeof(m_info));
if(m_fin.gcount() <= 5)
return 0;
m_ipSearchEnd.uip = m_info.ip_end.uip;
return 1;
}
int CQQWry::search(string ip)
{
m_fin.open("QQWry.dat", ios::in | ios::binary);
if(!m_fin.is_open())
return -1;
if(!init())
{
m_fin.close();
return -1;
}
m_ip.uip = inet_addr(ip.c_str());
in_addr a;
//memcpy(&m_ip, ip.c_str(), ip.length());
//swap(m_ip.addr[0], m_ip.addr[3]);
//swap(m_ip.addr[1], m_ip.addr[2]);
uBindex = 0;
uEindex = (m_head.uEindex - m_head.uBindex) / 7;
uMindex = (uEindex + uBindex) / 2;
while(uBindex < uEindex)
{
readInfo(uMindex);
if(m_ip.uip == m_ipSearch.uip)
{
uResult = uMindex;
memcpy(&a, &m_ipSearch.uip, 4);
cout << inet_ntoa(a) <<"\t\t";
memcpy(&a, &m_ipSearchEnd.uip, 4);
cout << inet_ntoa(a) << endl;
return 1;
}
else if(uEindex - uBindex <= 1)
{
for(uLong u = uBindex; u <= uEindex; ++u)
{
readInfo(u);
readEndInfo();
if(m_ipSearch.uip <= m_ip.uip && m_ip.uip <= m_ipSearchEnd.uip)
{
uResult = u;
memcpy(&a, &m_ipSearch.uip, 4);
cout << inet_ntoa(a) <<"\t\t";
memcpy(&a, &m_ipSearchEnd.uip, 4);
cout << inet_ntoa(a) << endl;
return 1;
}
memcpy(&a, &m_ipSearch.uip, 4);
cout << inet_ntoa(a) <<"\t\t";
memcpy(&a, &m_ipSearchEnd.uip, 4);
cout << inet_ntoa(a) << endl;
}
break;
}
else
{
if(m_ip.uip > m_ipSearch.uip)
uBindex = uMindex;
else
uEindex = uMindex;
uMindex = (uEindex + uBindex) / 2;
}
}
cout << "未找到" <<endl;
m_fin.close();
return 0;
}
int main(int argc, char* argv[])
{
CQQWry cqqwry;
if(cqqwry.search("121.9.242.210"))
cqqwry.show();
return 0;
}
ver3
#include <iostream>
#include <fstream>
#include <string>
#include <WINSOCK2.H>
using namespace std;
#pragma comment(lib, "ws2_32.lib")
typedef unsigned long uLong;
typedef unsigned char uChar;
typedef struct _QQWryHead
{
uLong uBindex;
uLong uEindex;
}QQWryHead, *PQQWryHead;
typedef union _QQWryIP
{
uLong uip;
uChar addr[4];
}QQWryIP, *PQQWryIP;
typedef struct _QQWryIndex
{
QQWryIP ip;
QQWryIP point;
}QQWryIndex;
typedef struct _QQWryInfo
{
QQWryIP ip_end;
QQWryIP mod;
}QQWryInfo;
class CQQWry
{
private:
ifstream m_fin;
QQWryHead m_head;
QQWryIP m_ip;
QQWryIP m_ipSearch;
QQWryIP m_ipSearchEnd;
QQWryIndex m_index;
QQWryInfo m_info;
uLong uBindex;
uLong uEindex;
uLong uMindex;
uLong uIndexCount;
uLong uResult;
///
bool init();
int readInfo(int index);
int readEndInfo();
public:
CQQWry();
~CQQWry(){};
int search(string ip);
void show();
};
void CQQWry::show()
{
cout << uResult <<endl;
}
CQQWry::CQQWry():uBindex(0), uEindex(0), uMindex(0), uIndexCount(0), uResult(0)
{
memset(&m_head, 0, sizeof(m_head));
memset(&m_ip, 0, sizeof(m_ip));
memset(&m_ipSearch, 0, sizeof(m_ipSearch));
memset(&m_ipSearchEnd, 0, sizeof(m_ipSearchEnd));
memset(&m_index, 0, sizeof(m_index));
memset(&m_info, 0, sizeof(m_info));
}
bool CQQWry::init()
{
m_fin.clear();
m_fin.seekg(0, ios::beg);
m_fin.read((char*)&m_head, sizeof(m_head));
if(m_fin.gcount() != sizeof(m_head))
return false;
return true;
}
int CQQWry::readInfo(int index)
{
m_fin.clear();
m_fin.seekg(m_head.uBindex + 7 * index, ios::beg);
m_fin.read((char*)&m_index, sizeof(m_index));
if(m_fin.gcount() <= 7)
return 0;
m_ipSearch.uip = m_index.ip.uip;
return 1;
}
int CQQWry::readEndInfo()
{
m_fin.clear();
uLong off = 0;
off = m_index.point.addr[0];
off += m_index.point.addr[1] << 8;
off += m_index.point.addr[2] << 16;
m_fin.seekg(off, ios::beg);
m_fin.read((char*)&m_info, sizeof(m_info));
if(m_fin.gcount() <= 5)
return 0;
m_ipSearchEnd.uip = m_info.ip_end.uip;
return 1;
}
int CQQWry::search(string ip)
{
m_fin.open("QQWry.dat", ios::in | ios::binary);
if(!m_fin.is_open())
return -1;
if(!init())
{
m_fin.close();
return -1;
}
m_ip.uip = inet_addr(ip.c_str());
in_addr a;
//memcpy(&m_ip, ip.c_str(), ip.length());
swap(m_ip.addr[0], m_ip.addr[3]);
swap(m_ip.addr[1], m_ip.addr[2]);
uBindex = 0;
uEindex = (m_head.uEindex - m_head.uBindex) / 7;
uMindex = (uEindex + uBindex) / 2;
while(uBindex < uEindex)
{
readInfo(uMindex);
if(m_ip.uip == m_ipSearch.uip)
{
uResult = uMindex;
memcpy(&a, &m_ipSearch.uip, 4);
cout << inet_ntoa(a) <<"\t\t";
readEndInfo();
memcpy(&a, &m_ipSearchEnd.uip, 4);
cout << inet_ntoa(a) << endl;
return 1;
}
else if(uEindex - uBindex <= 1)
{
for(uLong u = uBindex; u <= uEindex; ++u)
{
readInfo(u);
readEndInfo();
if(m_ipSearch.uip <= m_ip.uip && m_ip.uip <= m_ipSearchEnd.uip)
{
uResult = u;
memcpy(&a, &m_ipSearch.uip, 4);
cout << inet_ntoa(a) <<"\t\t";
memcpy(&a, &m_ipSearchEnd.uip, 4);
cout << inet_ntoa(a) << endl;
return 1;
}
memcpy(&a, &m_ipSearch.uip, 4);
cout << inet_ntoa(a) <<"\t\t";
memcpy(&a, &m_ipSearchEnd.uip, 4);
cout << inet_ntoa(a) << endl;
}
break;
}
else
{
if(m_ip.uip > m_ipSearch.uip)
uBindex = uMindex;
else
uEindex = uMindex;
uMindex = (uEindex + uBindex) / 2;
}
}
cout << "未找到" <<endl;
m_fin.close();
return 0;
}
int main(int argc, char* argv[])
{
CQQWry cqqwry;
string strip = "1.3.0.1";
cout << strip <<endl;
if(cqqwry.search(strip))
cqqwry.show();
return 0;
}