临时存放

14 篇文章 0 订阅

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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值