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

📄 appip.cpp

📁 linux 上http email 协议分析程序 主要能够处理大数据量的主干网的应用
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>

#include <netinet/in.h>
#include <netinet/ip.h>
#include <netinet/tcp.h>
#include <netinet/udp.h>

#include <Config.h>
#include <Utility.h>


#include "Consts.h"
#include "Db.h"
#include "AppIp.h"
#include "Basic.h"

//#define TRACEFILE 1
//#define FROMFILE 1
#define DEBUG 1
#define USEDBCFG 1
//read config information from db
int CAppIp::initIpCfgDB()
{
	CTblWebApp tblweb;
	STRU_TR_T_WEBMONRULE recrule;
	STRU_TR_T_SUBMITRULE recsubmitrule;

	m_totipcfg=0;
	m_totipcfg=tblweb.totCount_TR_T_WEBMONRULE();
	if( m_totipcfg<=0)
		return m_totipcfg;
	
	m_pipcfgdb=new StIpCfgDB[m_totipcfg];
	int iii;
	for(iii=0;iii<m_totipcfg;iii++)
	{
		tblweb.fetchRecord(&(recrule));

		TU::delSpace(recrule.WMR_URLFEATURE);
		TU::delSpace(recrule.WMR_HOST);
		
		printf("[%s][%s]\n",recrule.WMR_HOST,recrule.WMR_URLFEATURE);	
		TLog::toErr("[%s][%s]\n",recrule.WMR_HOST,recrule.WMR_URLFEATURE);
		
		strcpy((m_pipcfgdb+iii)->szurl,recrule.WMR_URLFEATURE);
		strcpy((m_pipcfgdb+iii)->szhost,recrule.WMR_HOST);
		(m_pipcfgdb+iii)->wapid=recrule.WAP_ID;
		(m_pipcfgdb+iii)->wmrid=recrule.WMR_ID;
	}
	tblweb.closeCur();

	for( iii=0;iii<m_totipcfg;iii++)
	{
		
		int inums=tblweb.totCount_TR_T_SUBMITRULE((m_pipcfgdb+iii)->wmrid);
		(m_pipcfgdb+iii)->inumdomain=inums;
		(m_pipcfgdb+iii)->szdomain= new char[64*inums];
		(m_pipcfgdb+iii)->szdomain_app= new char[64*inums];
		int id=(m_pipcfgdb+iii)->wmrid;

		for(int j=0;j<inums;j++)
		{
			tblweb.fetchRecord(&recsubmitrule,id);
			TU::delSpace(recsubmitrule.SBR_SUBMITFIELD);
			TU::delSpace(recsubmitrule.SBR_APPFIELD);
			strcpy((m_pipcfgdb+iii)->szdomain+64*j,recsubmitrule.SBR_SUBMITFIELD);
			strcpy((m_pipcfgdb+iii)->szdomain_app+64*j,recsubmitrule.SBR_APPFIELD);
			
			printf("[%s][%s]\n",(m_pipcfgdb+iii)->szdomain+64*j,(m_pipcfgdb+iii)->szdomain_app+64*j);
			TLog::toErr("[%s][%s]\n",(m_pipcfgdb+iii)->szdomain+64*j,(m_pipcfgdb+iii)->szdomain_app+64*j);
		}
		tblweb.closeCur();
		
	}

	for(int ii=0;ii<m_totipcfg ;ii++)
	{
		
		printf("url=[%s] ,host=[%s],wapid=[%d] wmrid=[%d] inumdomain=[%d]",
			(m_pipcfgdb+ii)->szurl,(m_pipcfgdb+ii)->szhost,
			(m_pipcfgdb+ii)->wapid,
			(m_pipcfgdb+ii)->wmrid,
			(m_pipcfgdb+ii)->inumdomain);

		TLog::toErr("url=[%s] ,host=[%s],wapid=[%d] wmrid=[%d] inumdomain=[%d]",
			(m_pipcfgdb+ii)->szurl,(m_pipcfgdb+ii)->szhost,
			(m_pipcfgdb+ii)->wapid,
			(m_pipcfgdb+ii)->wmrid,
			(m_pipcfgdb+ii)->inumdomain);

		for(int jj=0;jj<m_pipcfgdb->inumdomain;jj++)
		{
			printf("[%s]",(m_pipcfgdb+ii)->szdomain+64*jj);
			TLog::toErr("[%s]",(m_pipcfgdb+ii)->szdomain+64*jj);
		}
		printf("\n");
		TLog::toErr("\n");
	}
	
	return m_totipcfg;

}

int CAppIp::initIpCfg(char *filename)
{
	FILE *fp;
	char szbuf[512];
	size_t isize=511;

	char *pbuf=szbuf;
		
	fp=fopen(filename,"r");
	if(fp==NULL)
	{
		printf("failure in open file [%s]",filename);
		return -1;
	}
	m_totipcfg=0;
	while(getline(&pbuf,&isize,fp)>0)
	{
		if(isize>10)
			m_totipcfg++;
	}
	if(m_totipcfg<=0)
		return 0;

	m_pipcfg=new StIpCfg[m_totipcfg];
	rewind(fp);
	
	m_totipcfg=0;
	int icurcfg=0;
	int len;
	while((len=getline(&pbuf,&isize,fp))>0)
	{
		pbuf[len-1]=0;
		
		char *p=strtok(szbuf,",");
		assert(p!=NULL);
		{
			(m_pipcfg+icurcfg)->option=*p;
		}

		p=strtok(NULL,",");
		assert(p!=NULL);
		{
			struct in_addr inaddr;
			if(!inet_aton(p, &inaddr))
			{
				printf("invalid ip=[%s]\n",p);
				return -1;
			}
			(m_pipcfg+icurcfg)->ip=inaddr.s_addr;
		}
		
		p=strtok(NULL,",");
		assert(p!=NULL);
		{
          strcpy((m_pipcfg+icurcfg)->szpost,p);
		}

		p=strtok(NULL,",");
		assert(p!=NULL);
        {
              strcpy((m_pipcfg+icurcfg)->szurl,p);
        }

		p=strtok(NULL,",");
		assert(p!=NULL);
		{
			(m_pipcfg+icurcfg)->wapid=atoi(p);
		}
		
		p=strtok(NULL,",");
		assert(p!=NULL);
		{
			int inums=atoi(p);
			(m_pipcfg+icurcfg)->inumdomain=inums;
			(m_pipcfg+icurcfg)->szdomain=new char[64*inums];
		
			for(int i=0;i<inums;i++)
			{
				p=strtok(NULL," ");
				assert(p!=NULL);
				assert(strlen(p)<32);
				strcpy((m_pipcfg+icurcfg)->szdomain+i*32,p);
			}
			icurcfg++;
		}
	}
	fclose(fp);
	
	m_totipcfg=icurcfg;

	for(int i=0;i<m_totipcfg;i++)
	{
		printf("option=[%c]\n",(m_pipcfg+i)->option);
		printf("ip=[%u]\n",(m_pipcfg+i)->ip);
		printf("post=[%s]\n",(m_pipcfg+i)->szpost);
		printf("url=[%s]\n",(m_pipcfg+i)->szurl);
		printf("wapid=[%d]\n",(m_pipcfg+i)->wapid);
		printf("tot-domain=[%d]",(m_pipcfg+i)->inumdomain);

		for(int j=0;j<(m_pipcfg+i)->inumdomain;j++)
		{
			printf("<%s>,",(m_pipcfg+i)->szdomain+32*j);
		}
		printf("\n\n");
	}

	return icurcfg;
}

bool CAppIp::initDb(char *filename)
{
	char buf[128];
	char buf1[128];
	CConfig cfg;
		
	if (cfg.ReadConfig(filename) != 0)
	{
		printf("Read %s Failed!\n",filename);
		return false;
	}
	
	if(cfg.GetItemValue("DB", "name", buf)!=0)
	{
		printf("Read DB:id Failed!\n");
		return false;
	}

	if(cfg.GetItemValue("DB", "passwd", buf1)!=0)
	{
		printf("Read DB:id Failed!\n");
		return false;
	}
	
	COra *db=new COra(buf,buf1);
	
	m_ptblweb=new CTblWeb();
	m_pseqweb=new CSeqWeb();

	m_psptblweb=new CSpTblWeb();
	m_pspseqweb=new CSpSeqWeb();
	
	m_pSeqSpWarm=new CSeqSpWarm();
	m_pTblSpWarm=new CTblSpWarm();	
		
	return true;

}

bool CAppIp::initShm(char *filename)
{
	char buf[128];
	
	int ishmid,ishmsize;
	CConfig cfg;
		
	if (cfg.ReadConfig(filename) != 0)
	{
		printf("Read %s Failed!\n",filename);
		return false;
	}
		
	if(cfg.GetItemValue("COLLSHM", "key_httpip", buf)!=0)
	{
		printf("Read SHM:id Failed!\n");
		return false;
	}
	ishmid=atoi(buf);

	if(cfg.GetItemValue("COLLSHM", "size_httpip", buf)!=0)
	{
		printf("Read SHM:size Failed!\n");
		return false;
	}
	ishmsize=atoi(buf)*1024*1024;
	
	m_pshm=new CShmApply();
	printf("init shmid \n");
	m_pshm->init(ishmid,ishmsize, SHM_APPPERM);


	m_pInfo=new CDataInfo();

	if(cfg.GetItemValue("IPWATCH", "key", buf)!=0)
	{
		printf("Read SHM:id Failed!\n");
		exit(-1);
	}
	ishmid=atoi(buf);

	if(cfg.GetItemValue("IPWATCH", "size", buf)!=0)
	{
		printf("Read SHM:size Failed!\n");
		exit(-1);
	}
	ishmsize=atoi(buf)*1024*1024;
	//m_prdsip=new CRtRdsIP();
	m_prdsip.init(ishmid,ishmsize);

	return true;

}

CAppIp::CAppIp(char *syscfg,char *ipcfg)
{
	
	
	if(!initDb(syscfg))
	{
		printf("failure of initing dbcfg\n");
		exit(-1);
	}

	#ifdef USEDBCFG

	if( initIpCfgDB()<=0)
	{
		printf("failure of initing ipcofig\n");
		exit(-1);
	}
	
	#else

	if( initIpCfg(ipcfg)<=0)
	{
		printf("failure of initing ipcofig\n");
		exit(-1);
	}
	#endif

	if(!initShm(syscfg))
	{
		printf("failure of initing shmcofig\n");
		exit(-1);
	}		

	m_theinqStream=new Cmimestream();

	m_pinqhv=new Chv();

	m_pinqhv->init("Host,Connection,Referer,Content-Length,Content-Type,Cookie");
}

void CAppIp::run()
{
	
	#ifdef FROMFILE
		m_ilenrcv=readFile(m_szrcv);
	#else
		m_ilenrcv=m_pshm->read(m_szrcv);
	#endif
	
	if(m_ilenrcv<=0)
	{
		sleep(1);
		return;
	}

	m_piph=(struct iphdr *)(m_szrcv ) ;
	if(m_piph->version!=4)//ipv4
		return;
	if(m_piph->protocol!=6)//TCP协议
		return;

	m_ptcph=(struct tcphdr*)(m_szrcv + 4*m_piph->ihl);

	int iplen=ntohs(m_piph->tot_len);
	int tcphlen=m_ptcph->doff*4;
	int iphlen=4*m_piph->ihl;
	int datalen=iplen-tcphlen-iphlen;
	if(datalen>0)
	{
		char *pdata=m_szrcv+iphlen+tcphlen;
		#ifdef DEBUG
				//TLog::toErr("tmplen=[%d]\n",m_ilenrcv);
				saveIpFile(m_szrcv, m_ilenrcv,".");
		#endif
		if(m_prdsip.isInWatched(m_piph->saddr))
		{
			printf("------------this is tekong[%u] --------------\n",m_piph->saddr);
			TLog::toErr("------------this is tekong[%u] --------------\n",m_piph->saddr);
			/*#ifdef TRACEFILE
				traceIpFile(m_szrcv, m_ilenrcv,"../tracelog");
			#endif*/
			processTKong(m_piph->daddr,pdata,datalen);
			writeTKongPage(datalen);
			registerWatchedObj();
			registerContent();
		}
		
		#ifdef USEDBCFG
			processFKongDB(m_piph->daddr,pdata,datalen);
		#else
			processFKong(m_piph->daddr,pdata,datalen);
		#endif
					
		
	}

}

void CAppIp::processTKong(u_int32_t ip,	char *szdata,int lendata)
{

	char *p;
	int len;
	char szbuf[1024];
			
	memset(szbuf,0,sizeof(szbuf));

	m_theinqStream->init(lendata,szdata);
	len=m_theinqStream->getLine(szbuf,512);
	if(len<=0)

⌨️ 快捷键说明

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