⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hash.cpp

📁 linux 上http email 协议分析程序 主要能够处理大数据量的主干网的应用
💻 CPP
字号:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include "Hash.h"
#include "Stru.h"


Chash_v::Chash_v(int ibasecount,int itotcount)
{
	int isize[2];
	int icount[2];

	m_ibasecount=ibasecount;

	isize[0]=sizeof(TUnit_v);
	isize[1]=0;

	icount[0]=itotcount;
	icount[1]=0;

	m_theMem=new CMem();
	m_theMem->init(icount,isize);

	
	m_pbase=new (void *)[ibasecount];
	
	for(int i=0;i<m_ibasecount;i++)
		m_pbase[i]=NULL;
	

}

Chash_v::~Chash_v()
{
	
	if(m_pbase)
		delete m_pbase;
	if(m_theMem)
		delete m_theMem;
}

bool Chash_v::find(TUnit_v *paunit)
{
	TUnit_v *punit;
	
	int id=getPos(paunit->key);
	//printf("in hash to find id=[%d] ",id);
	id=id%m_ibasecount;
	//printf("id=[%d] b=[%d]\n",id,m_pmemhash->m_ibasecount);
	punit=(TUnit_v *)(m_pbase[id]);
	if(punit==NULL)
	{
		//printf("is free head\n",id);
		return false;
	}
	while(!(punit->key==paunit->key))
	{
		if(punit->pnext!=NULL)
		{
			punit=punit->pnext;
		}
		else
			return false;
	}
	
	memcpy((char *)paunit,(char *)punit,sizeof(TUnit_v));
	return true;
}


bool Chash_v::add(TUnit_v *paunit)
{
	
	TUnit_v *punit;

	time(&(paunit->ltime));
	int id=getPos(paunit->key);
	id=id%m_ibasecount;
	//printf("id=[%d] basecount=[%d] \n",id,m_pmemhash->m_ibasecount);

	punit=(TUnit_v *)(m_pbase[id]);
	//printf("punit->ipne=[%d]",punit->ipnext);
	if(punit==NULL)
	{
		
		char *pbuffer=m_theMem->maloc(sizeof(TUnit_v));

		punit= (TUnit_v *)pbuffer;
		
		memcpy((char *)punit,(char *)paunit,sizeof(TUnit_v));
		
		punit->pnext=NULL;

		m_pbase[id]=punit;
		
		return true;
	}
	
	while(!(punit->key==paunit->key))
	{
		//printf("punit next=[%d]\n",punit->ipnext);
		if(punit->pnext!=NULL)
		{
			punit=punit->pnext;
		}
		else
		{
			char *pbuffer=m_theMem->maloc(sizeof(TUnit_v));

			if(pbuffer!=NULL)
			{
				memcpy(pbuffer,(char *)paunit,sizeof(TUnit_v));
		
				((TUnit_v *)pbuffer)->pnext=NULL;

				punit->pnext=(TUnit_v *)pbuffer;
			
				return true;
			}
			else
				return false;
			
		}
	}
	//printf("hash node repeat info\n ");

	return false;
}


bool Chash_v::remove(TUnit_v *paunit)
{
	
	void *punit;
	void **plast=NULL;
	
	int id=getPos(paunit->key);
	id=id%m_ibasecount;

	punit=m_pbase[id];

	if(punit==NULL)
		return false;

	plast=&(m_pbase[id]);

	
	while(!( ((TUnit_v *)punit)->key==paunit->key) )
	{
		if(((TUnit_v *)punit)->pnext!=NULL)
		{
			plast=(void * *)&(((TUnit_v *)punit)->pnext);
			punit=((TUnit_v *)punit)->pnext;
		}
		else
		{
			printf("not find the node\n");
			return false;
		}
	}
	
	assert(plast!=NULL);
	*plast=((TUnit_v *)punit)->pnext;
	m_theMem->free((char *)punit);
		
	return true;
	
}

int Chash_v::clear(TUnit_v *punitout,int maxunit)
{
		void **plast;
		void *punit;
	
		if(!timeout())
			return 0;
	
		printf("to clean timeout record\n");

		time_t lntime;
		time(&lntime);
		int itot=0;

		for(int i=0;i<m_ibasecount;i++)
		{
			punit=m_pbase[i];
			plast=&(m_pbase[i]);
				
			while(punit!=NULL)
			{
				if(lntime-((TUnit_v *)punit)->ltime>30)
				{
					memcpy(punitout,punit,sizeof(TUnit_v));
					punitout++;
					itot++;
									
					printf("to clean [%d]  record timeout\n",itot);
					*plast=((TUnit_v *)punit)->pnext;
				
					m_theMem->free((char *)punit);
			
					punit=((TUnit_v *)punit)->pnext;
				}
				else
				{
					plast=(void * *)&(((TUnit_v *)punit)->pnext);
					punit=((TUnit_v *)punit)->pnext;
				}
				
				if(itot>=maxunit)
						return itot;
			}
		}
		return itot;
}


void Chash_v::clearMem(CMem *ptheMem)
{
	
	void **plast;
	void *punit;
	
	if(!timeout())
		return;
	
	printf("to clean timeout record\n");

	time_t lntime;
	time(&lntime);
	int itot=0;

	for(int i=0;i<m_ibasecount;i++)
	{
		
		punit=m_pbase[i];
		plast=&(m_pbase[i]);
				
		while(punit!=NULL)
		{
			if(lntime-((TUnit_v *)punit)->ltime>30)
			{
				itot++;
				printf("to clean [%d]  record timeout\n",itot);
				*plast=((TUnit_v *)punit)->pnext;

				ptheMem->free((char *)((TUnit_v *)punit)->pval);

				m_theMem->free((char *)punit);
			
				punit=((TUnit_v *)punit)->pnext;

			}
			else
			{
				plast=(void * *)&(((TUnit_v *)punit)->pnext);
				punit=((TUnit_v *)punit)->pnext;
			}
		}
	
	}

}


int Chash_v::getPos(TKey &key)
{

	int i;
	i=key.src_ip&0xffffff;
	i+=key.src_port;
	i=i&key.dst_ip;
	i+=key.dst_port;
	return i;
}

	
bool Chash_v::timeout()
{
	time_t lnow;

	time(&lnow);
	if(lnow-m_lctime>30)
	{
		m_lctime=lnow;
		return true;
	}

	return false;

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -