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

📄 msnmain.pc

📁 linux 上http email 协议分析程序 主要能够处理大数据量的主干网的应用
💻 PC
字号:
/************************************************************ *  FileName:       MSNMain.pc *  Author:         Jay *  Date:           2004.05.29 *  Version:        V01.00.00.00 *  Description:    1.监控MSN聊天 *                  2. *                  3. * ************************************************************/#include "MSN.h"#include "Config.h"#include <iostream.h>#include <stdlib.h>#include <unistd.h>#include "ShmApply.h"#include "Log.h"#include "RtRadiusIP.h"#include "IPPacket.h"#include "Timeutil.h"#include "Tools.h"EXEC SQL INCLUDE sqlca;EXEC ORACLE OPTION (RELEASE_CURSOR = YES);#define SQLCODE sqlca.sqlcode#define SQLNOTFOUND 1403void terminate(int sig){	EXEC SQL ROLLBACK WORK RELEASE;  	exit(0);}void usage (const char* _str){	printf("usage:%s <config file>\n",_str);}bool oracle_error(const char* _str){	int intSqlCode = sqlca.sqlcode;	if (intSqlCode < 0)	{		cout <<_str<<sqlca.sqlcode << endl;		cout << sqlca.sqlerrm.sqlerrmc << endl;		writelog("%s,code:%ld,%s",_str,sqlca.sqlcode,sqlca.sqlerrm.sqlerrmc);		EXEC SQL ROLLBACK RELEASE;		exit(-1);	}	return false;}int connectDB(const char* cname,const char* cpass){	CTools::signal(SIGTERM,terminate);	CTools::signal(SIGINT,terminate);	CTools::signal(SIGQUIT,terminate);	CTools::signal(SIGCHLD,SIG_IGN);	EXEC SQL BEGIN DECLARE SECTION;	char vc_name[32]="";	char vc_pass[32]="";	char vc_server[32]="";	EXEC SQL END DECLARE SECTION;	if(cname==NULL || strlen(cname)>=32)	{		printf("用户名:[%s]不符合规范!\n");		writelog("用户名:[%s]不符合规范!\n");		return -1;	}	if(cpass==NULL || strlen(cpass)>=32)	{		printf("密码:[%s]不符合规范!\n");		writelog("密码:[%s]不符合规范!\n");		return -1;	}	strcpy(vc_name,cname);	strcpy(vc_pass,cpass);	EXEC SQL CONNECT :vc_name IDENTIFIED BY :vc_pass ;	if(oracle_error("连接数据库"))		return -1;	return 0;}int main(int argc,char* argv[]){	if(argc!=2)	{		usage(argv[0]);		return -1;	}	//EXEC SQL WHENEVER SQLERROR DO oracle_error("ORACLE ERROR: ");	EXEC SQL BEGIN DECLARE SECTION;	char sql_account[100]="";	char sql_ip[20]="";	long sql_id=0;	EXEC SQL END DECLARE SECTION;	CConfig cfg;	if(cfg.ReadConfig(argv[1]) !=0)	{		printf("打开配置文件[%s]失败!\n",argv[1]);		exit(1);	};	char dbuser[255];	memset(dbuser,0x00,sizeof(dbuser));	if(cfg.GetItemValue("DB","name",dbuser)!=0)	{		printf("配置文件格式错误,读取数据库用户名失败! [DB]:name\n");		exit(1);	}	char dbpasswd[255];	memset(dbpasswd,0x00,sizeof(dbpasswd));	if(cfg.GetItemValue("DB","passwd",dbpasswd)!=0)	{		printf("配置文件格式错误,读取数据库密码失败! [DB]:passwd\n");		exit(1);	}	char tmp[255];	int key,size;	///读取配置文件中RtRadiusIP用到的字段	if (cfg.GetItemValue("IPWATCH","key",tmp)!=0)	{		printf("配置文件格式错误,读取共享内存key失败! [IPWATCH]:key\n");		exit(1);	}	key = atoi (tmp);	if ( key <= 0)	{		printf("配置文件格式错误,[IPWATCH]:key必须为大于0的整数!\n");		exit(1);	}	if (cfg.GetItemValue("IPWATCH","size",tmp)!=0)	{		printf("配置文件格式错误,读取共享内存SIZE失败! [IPWATCH]:size\n");		exit(1);	}	size = atoi (tmp);	if ( size <= 0)	{		printf("配置文件格式错误,[IPWATCH]:size必须为大于0的整数(单位Mb)!\n");		exit(1);	}	size = size*1024*1024;	if(openlog("../log/msn.log")!=0)	{		exit(1);	}	CRtRdsIP myrt;	if (myrt.init(key,size)!=0)	{		writelog("初始化共享内存(ip_radius_relation)失败!");		printf("初始化共享内存(ip_radius_relation)失败!\n");		return -1;	}	writelog("初始化共享内存(ip_radius_relation)完成");	//读取配置文件中,与CShmApply有关部分	int key_msn,size_msn;	if (cfg.GetItemValue("COLLSHM","key_msn",tmp)!=0)	{		printf("配置文件格式错误,读取共享内存key_msn失败! [COLLSHM]:key_msn\n");		exit(1);	}	key_msn = atoi (tmp);	if ( key_msn <= 0)	{		printf("配置文件格式错误,[COLLSHM]:key_msn必须为大于0的整数!\n");		exit(1);	}	if (cfg.GetItemValue("COLLSHM","size_msn",tmp)!=0)	{		printf("配置文件格式错误,读取共享内存SIZE失败! [COLLSHM]:size_msn\n");		exit(1);	}	size_msn = atoi (tmp);	if ( size_msn <= 0)	{		printf("配置文件格式错误,[COLLSHM]:size_msn必须为大于0的整数(单位Mb)!\n");		exit(1);	}	size_msn = size_msn*1024*1024;	CShmApply shmApp;	if (shmApp.init(key_msn,size_msn,0666)!=0 )	{		writelog("初始化共享内存(CSHmApply shmApp)失败!程序自动退出");		printf("init CShmApply (CSHmApply shmApp)fail!process quit");		return -1;	}	writelog("初始化共享内存(CSHmApply shmApp)成功,连接数据库...");	if (connectDB(dbuser,dbpasswd)!=0)	{		printf("连接数据库失败!程序退出!\n");		writelog("connect database fail!process quit!\n");    		exit(1);	}	writelog("连接数据库成功!");	//预处理	EXEC SQL BEGIN DECLARE SECTION;	unsigned long sql_cli_ip;	unsigned long sql_svr_ip;	unsigned long sql_cli_port;	char sql_time[20];	EXEC SQL END DECLARE SECTION;	char rbuf[NETMON_IP_MTU+20];	int result;	CMSN msn;	IP_PACKET * pip;	TCP_PACKET *ptcp;	const unsigned char * pcontent;	int len;	//进入循环	while(true)	{		result = shmApp.read(rbuf);		if (result <0 )			break;//读共享内存出错,退出		if (result == 0)		{			usleep(10);			continue;		}		pip = (IP_PACKET *) rbuf;		ptcp = (TCP_PACKET*)((char*)(rbuf)+get_ip_headlen(pip));		if (get_tcp_fin (ptcp))		{			if ( get_tcp_dst_port( ptcp) == 18183 )//ntohs(1863) = 18183,MSN服务器端口			{				sql_cli_ip = get_ip_src_ip(pip);				sql_svr_ip = get_ip_dst_ip(pip);				sql_cli_port = get_tcp_src_port( ptcp);			}			else			{				continue;			}			EXEC SQL select NVL(max(MSN_ID),0) into :sql_id from TR_T_MSNSESSION  where  MSN_CLIENTIP = :sql_cli_ip and MSN_SERVERIP = :sql_svr_ip and MSN_CLIENTPORT = :sql_cli_port;			if (sql_id == 0)				continue;			Jget14bytestime(sql_time,sizeof(sql_time));			cout<<"msnid:"<<sql_id<<"end time:["<<sql_time<<"]cliip:["<<sql_cli_ip<<"]cli_port:["<<				sql_cli_port<<"]svrip:["<<sql_svr_ip<<endl;			EXEC SQL WHENEVER SQLERROR DO oracle_error("EXECUTE upd_msn_session_time  ERROR: ");			EXEC SQL update TR_T_MSNSESSION set MSN_STOPTIME = :sql_time where MSN_STOPTIME IS NULL and MSN_CLIENTIP = :sql_cli_ip and MSN_CLIENTPORT = :sql_cli_port and MSN_SERVERIP = :sql_svr_ip;			EXEC SQL COMMIT WORK;			continue;		}		get_ip_content(len,pip);		rbuf[len + sizeof(IP_HEADER) + 1] = 0;		if (msn.init(pip)!=0)		{			printf ("init fail\n");			continue;		}		if (msn.isMsgPacket())		{ 			if (msn.addChatRecord () !=0)			{				printf("add ChatRecord fail!\n");				continue;			}		}		else if (msn.isNewSession())		{ 			msn.newSession();				}	}	EXEC SQL ROLLBACK WORK RELEASE;  	return 0;}

⌨️ 快捷键说明

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