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

📄 apptelnet.cpp

📁 linux 上http email 协议分析程序 主要能够处理大数据量的主干网的应用
💻 CPP
字号:

#include <stdio.h>
#include <string.h>

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

#include <arpa/inet.h>
#include <time.h>

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

#include "AppTelnet.h"
#define SIMULATE_SPE

void CAppTelnet::timeOut()
{
	
	m_pappisf->timeOut();
}

void CAppTelnet::run()
{
	struct iphdr *ptr_iph; 			// IP报头
	struct tcphdr *ptr_tcph;		// TCP报头
	m_ilenrcv=m_pshm->read(m_szrcv);
	if(m_ilenrcv<=0)
	{
		sleep(1);
		return;
	}
	ptr_iph=(struct iphdr *)(m_szrcv ) ;
	if(ptr_iph->version!=4)//ipv4
		return;
	if(ptr_iph->protocol!=6)//TCP协议
		return;
	
	ptr_tcph=(struct tcphdr*)(m_szrcv + 4*ptr_iph->ihl);
	if(ptr_tcph->source==5888 )
	{
		m_socket.saddr=ptr_iph->daddr;
		m_socket.daddr=ptr_iph->saddr;
		m_socket.sport=ptr_tcph->dest;
		m_socket.dport=ptr_tcph->source;
	}
	else if( ptr_tcph->dest==5888 )
	{
		m_socket.saddr=ptr_iph->saddr;
		m_socket.daddr=ptr_iph->daddr;
		m_socket.sport=ptr_tcph->source;
		m_socket.dport=ptr_tcph->dest;
	}
	else
		return;
	
	if(ptr_tcph->syn)
	{
		if(m_pappisf->searchFp(&m_socket)==NULL)
		{
			char szfilename[128];
			getFileName(&m_socket,szfilename);
			m_pappisf->addOneStream(&m_socket,szfilename);
			#ifdef DEBUG
			printf("start socket[%s]:\n",szfilename);
			#endif

		}
	}
	else if(ptr_tcph->fin)
	{
		#ifdef DEBUG
			char szfilename[128];
			getFileName(&m_socket,szfilename);
			szfilename[strlen(szfilename)-14]=0;
			printf("closed socket[%s]:\n",szfilename);
		#endif
			
		STRU_TR_T_TELNETINFO rec;
		rec.TLN_FILELENGTH=m_pappisf->delOneStream(&m_socket,rec.TLN_STRATTIME,rec.TLN_FILEPATH);
		if(rec.TLN_FILELENGTH>0)
		{
			struct in_addr inaddr;
			rec.TLN_ID=m_pseqcomm->getS_TR_T_TELNETINFO(); 
		
			strcpy(rec.TLN_STOPTIME,TUTime::YYYYMMDDHHMMSS());
			inaddr.s_addr = m_socket.saddr;
			sprintf(rec.TLN_CLIENTIP,"%s",inet_ntoa(inaddr));
		
			inaddr.s_addr = m_socket.daddr;
			sprintf(rec.TLN_SERVERIP,"%s",inet_ntoa(inaddr));
		
			strcpy(rec.TLN_CLIENTLOCATION,"office");
			strcpy(rec.TLN_CLIENTACCOUNT,"office");
			strcpy(rec.TLN_CLIENTCALLID,"office");
	   
			strcpy(rec.TLN_SERVERLOCATION,"office");
			strcpy(rec.TLN_SERVERACCOUNT,"office");
			strcpy(rec.TLN_SERVERCALLID,"office");
			rec.TLN_FILESTATUS=1;
			m_ptblcomm->insRecord(&rec);

			registerWatchedObj();
		}

	}
	else
	{
		FILE *fp;
		fp=m_pappisf->searchFp(&m_socket);
		if(fp!=NULL)
		{
			ptr_tcph=(struct tcphdr*)(m_szrcv + 4*ptr_iph->ihl);

			int iplen=ntohs(ptr_iph->tot_len);
			int tcphlen=ptr_tcph->doff*4;
			int iphlen=4*ptr_iph->ihl;
			int datalen=iplen-tcphlen-iphlen;
			if(datalen>0)
			{
				
				char *pdata=m_szrcv+iphlen+tcphlen;
				int outlen=filterCtrlChar(pdata,datalen,m_szdata);
				if(ptr_tcph->source==5888 )
					fprintf(fp,"\n%s:%05d\n","server",datalen);
				else
					fprintf(fp,"\n%s:%05d\n","client",datalen);
				fwrite(pdata,datalen,1,fp);
				//fwrite(m_szdata,outlen,1,fp);
				fflush(fp);
			}
		}
	}
}

int  CAppTelnet::filterCtrlChar(char *pin, int len, char *pout)
{
	int i,olen=0;
	for(int i=0;i<len;i++)
	{
		if(!((unsigned char)*pin & (unsigned char)0x80))
		{
			*pout=*pin;	
			pout++;
			olen++;
		}
		pin++;
	}
	*pout=0;
	return olen;
}


int CAppTelnet::registerWatchedObj()
{
	#ifdef SIMULATE_SPE
		STRU_TR_T_OBJECT2INFO rec;
		
		rec.OTI_ID=m_pSeqSpWarm->getS_TR_T_OBJECT2INFO();
		rec.AMG_ID=102;
		rec.OTI_INFOID=m_pseqcomm->getfkS_TR_T_TELNETINFO();
		rec.OTI_INFOTYPE=8;
		rec.OTI_RPRECISION=0;
		rec.OTI_READSTATUS=1;
		m_pTblSpWarm->insRecord(&rec);
		return 102;
	#else
	ST_AIMOBJ stObj[32];
	int iobjs=m_prdsip->isInWatched(m_socket.saddr,stObj);

	for(int i=0;i<iobjs;i++)
	{
		STRU_TR_T_OBJECT2INFO rec;
		
		rec.OTI_ID=m_pSeqSpWarm->getS_TR_T_OBJECT2INFO();
		rec.AMG_ID=stObj[i].amgid;
		rec.OTI_INFOID=m_pseqcomm->getfkS_TR_T_TELNETINFO();
		rec.OTI_INFOTYPE=8;
		rec.OTI_RPRECISION=stObj[i].precision;
		rec.OTI_READSTATUS=1;
		m_pTblSpWarm->insRecord(&rec);
		
	}
	return stObj[0].amgid;;
	#endif
}	


void CAppTelnet::getFileName(Stru_Socket *psocket,char *filename)
{
	struct in_addr inaddr;
   
    inaddr.s_addr = psocket->saddr;
    sprintf(filename,"/telnetdata/%s::%d--",inet_ntoa(inaddr),ntohs(psocket->sport));
  
    inaddr.s_addr = psocket->daddr;
    sprintf(filename+strlen(filename),"%s::%d--",inet_ntoa(inaddr),ntohs(psocket->dport));
   
	strcat(filename,".");
    strcat(filename,TUTime::YYYYMMDDHHMMSS());

}

CAppTelnet::~CAppTelnet()
{

}

CAppTelnet::CAppTelnet(char *filename)
{
	int ishmid,ishmsize;
	char buf[128];
	char buf1[128];

	CConfig cfg;

	if(filename==NULL)
	{
		if (cfg.ReadConfig("../etc/config.ini") != 0)
		{
			if (cfg.ReadConfig("config.ini") != 0)
			{
				printf("Read config.ini  Failed!\n");
				exit(-1);
			}
		}
	}
	else
	{
		if (cfg.ReadConfig(filename) != 0)
		{
			printf("Read %s Failed!\n",filename);
			exit(-1);
		}
	}

	if(cfg.GetItemValue("DB", "name", buf)!=0)
	{
		printf("Read DB:id Failed!\n");
		exit(-1);
	}

	if(cfg.GetItemValue("DB", "passwd", buf1)!=0)
	{
		printf("Read DB:id Failed!\n");
		exit(-1);
	}
	COra *db=new COra(buf,buf1);
	
	if(cfg.GetItemValue("COLLSHM", "key_telnet", buf)!=0)
	{
		printf("Read SHM:id Failed!\n");
		exit(-1);
	}
	ishmid=atoi(buf);

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

	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);
	m_pappisf=new CIpStreamFile(10);

	m_ptblcomm=new CTblComm();
	m_pseqcomm=new CSeqComm();

	m_pSeqSpWarm=new CSeqSpWarm();
	m_pTblSpWarm=new CTblSpWarm();	

}



⌨️ 快捷键说明

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