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

📄 msn.pc

📁 linux 上http email 协议分析程序 主要能够处理大数据量的主干网的应用
💻 PC
字号:
/********************************************************************** *		FileName:	MSN.pc *		Author:		Jay *		Version:	V01.00.00.00 *		Date:		2004.05.28 *		Description:	 *			实现监控MSN类 * **********************************************************************/#include <stdio.h>#include <iostream.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#include <string.h>#include "MSN.h"#include "IPPacket.h"#include "TCPPacket.h"#include "loadAccount.h"#include "RtRadiusIP.h"#include "Log.h"#include "Timeutil.h"#include "Tools.h"#include "UTF8Util.h"#define SQLCA_STORAGE_CLASS externEXEC SQL INCLUDE sqlca;EXEC ORACLE OPTION (RELEASE_CURSOR = YES);#define SQLCODE sqlca.sqlcode#define SQLNOTFOUND 1403#define SENDER_CLI 0#define SENDER_SVR 1extern bool oracle_error(const char* _str);const char C_GB2312[] = "GB2312";const char C_MSN_SIGN_MSG_STR[] = {0x4d,0x53,0x47,0x20};const int C_MSN_SIGN_MSG = *((const int *)C_MSN_SIGN_MSG_STR); const short C_ENTER = *((const short*)C_CRLF);const char C_IM_MARK[]= "X-MMS-IM-Format";const long long C_IM_MARK_LL = *((const long long *)C_IM_MARK);const char C_MSN_SIGN_USR_STR[] = "USR "; const long C_MSN_SIGN_USR = *(long*)C_MSN_SIGN_USR_STR;const char C_MSN_SIGN_ANS_STR[] = "ANS "; const long C_MSN_SIGN_ANS = *(long*)C_MSN_SIGN_ANS_STR;/********************************************************************** *	Function:		判断这个包是否聊天包 *	Author:			Jay *	Version:		V01.00.00.00 *	Date:			2004.06.08 *	Description: *					根据包头是否"MSG",判断是否聊天包 *	return: *	true *	false **********************************************************************/bool CMSN::isMsgPacket (){	if (*(const int *)m_line == C_MSN_SIGN_MSG )		return true;	else		return false;}/********************************************************************** *	Function:		判断这个包是否标志一个新的session *	Author:			Jay *	Version:		V01.00.00.00 *	Date:			2004.06.08 *	Description: *					包头如果包含"USR ",或者 "ANS " 就有可能是新session *	return: *	true *	false **********************************************************************/bool CMSN::isNewSession (){//	printf ("%c%c%c%c\n",m_line[0],m_line[1],m_line[2],m_line[3]);	if (*(const int *)m_line == C_MSN_SIGN_USR || *(const int *)m_line == C_MSN_SIGN_ANS)		return true;	else		return false;}/********************************************************************** *	Function:		初始化 *	Author:			Jay *	Version:		V01.00.00.00 *	Date:			2004.05.28 *	Description: *					初始化类 *	return: *	0:				success *	-1:				fail **********************************************************************/int CMSN::init(const IP_PACKET *_ip){	m_ptcp = (const TCP_PACKET*)get_ip_content(m_TcpContentLen,_ip);	m_lineHead = (const char*)m_ptcp->tcp_content;	m_TcpContentLen-=sizeof(TCP_HEADER);	m_dst_ip = get_ip_dst_ip(_ip);	m_src_ip = get_ip_src_ip(_ip);	m_dst_port = get_tcp_dst_port(m_ptcp);	m_src_port = get_tcp_src_port(m_ptcp);	m_line = m_lineHead;	return 0;}/********************************************************************** *	Function:		获取下一行 *	Author:			Jay *	Version:		V01.00.00.00 *	Date:			2004.05.28 *	Description: *					每个MSG包都有好多行,每行以\x0d\x0a结尾, *					这个函数就是返回每个行的头部指针 **********************************************************************/const char* CMSN::getNextLine(){	while(m_line - m_lineHead < m_TcpContentLen - 2 && *((short*) m_line) != C_ENTER)	{		m_line ++;	}	if (m_line - m_lineHead >= m_TcpContentLen - 2)	{		return NULL;	}	return m_line + 2;}/********************************************************************** *	Function:		增加一个session *	Author:			Jay *	Version:		V01.00.00.00 *	Date:			2004.06.08 *	Description: *			收到的包如果是MSN协议中建立Session的命令,则新增一个 *			Session,写入数据库 *	return: *	0:				success *	-1:				fail **********************************************************************/int CMSN::newSession(){	EXEC SQL BEGIN DECLARE SECTION;		unsigned long sql_cli_ip;		unsigned long sql_svr_ip;		unsigned long sql_cli_port;		long sql_msn_id; 		long sql_sender;			//	sender,0表示客户端,1表示服务器,		char sql_time [20]; 		char sql_m_usr_id[40];	EXEC SQL END DECLARE SECTION;		m_line = m_lineHead;	bool isNewSession = false;	int tid;	if (sscanf(m_line,"USR %d OK %s\n",&tid,m_usr) == 2  )	{		//服务器发送m_usr OK ,允许建立session		memset (sql_m_usr_id,0x00,sizeof(sql_m_usr_id));		strcpy (sql_m_usr_id,m_usr);		if ( m_src_port == 18183 )//ntohs(1863) = 18183,MSN服务器端口		{			sql_cli_ip = m_dst_ip;			sql_svr_ip = m_src_ip;			sql_cli_port = m_dst_port;			isNewSession = true;		}		else			return 0;	}//end if (sscanf(m_line,"m_usr %d OK %s\n",&tid,m_usr) == 2  )	else if (sscanf (m_line,"ANS %d %s\n",&tid,m_usr) == 2)	{		//本地回应ANS信号,建立一个session		memset  (sql_m_usr_id,0x00,sizeof(sql_m_usr_id));		strcpy (sql_m_usr_id,m_usr);		if ( m_dst_port == 18183 )//ntohs(1863) = 18183,MSN服务器端口		{			sql_cli_ip = m_src_ip;			sql_svr_ip = m_dst_ip;			sql_cli_port = m_src_port;			isNewSession = true;		}		else 			return 0;	}//end if (sscanf (m_line,"ANS %d %s\n",&tid,m_usr) == 2)	if (isNewSession )	{		Jget14bytestime(sql_time,sizeof(sql_time));		cout<<"m_usrid:["<<sql_m_usr_id<<"]\nstart time:["<<sql_time<<"]cliip:["<<			sql_cli_ip<<"]cli_port:["<<sql_cli_port<<"]svrip:["<<sql_svr_ip<<endl;		EXEC SQL WHENEVER SQLERROR DO oracle_error("insert TR_T_MSNSESSION ");		EXEC SQL  insert into TR_T_MSNSESSION			(MSN_ID,MSN_CLIENTMSNID,MSN_STRATTIME,MSN_CLIENTIP,MSN_CLIENTPORT,MSN_SERVERIP)			values (S_TR_T_MSNSESSION.nextval,:sql_m_usr_id,:sql_time,:sql_cli_ip,:sql_cli_port,:sql_svr_ip);		EXEC SQL COMMIT WORK;	}	return 0;}/********************************************************************** *	Function:		增加一条聊天记录 *	Author:			Jay *	Version:		V01.00.00.00 *	Date:			2004.05.28 *	Description: *			收到的包如果是聊天记录包(MSG命令),则保存之 **********************************************************************/int CMSN::addChatRecord(){	EXEC SQL BEGIN DECLARE SECTION;	unsigned long sql_cli_ip;	unsigned long sql_svr_ip;	unsigned long sql_cli_port;	long sql_msn_id;	char sql_sendtime[20];	long sql_sender;	//		sender,0表示客户端,1表示服务器,	char sql_content[2000];	char sql_m_usr_id[40];	EXEC SQL END DECLARE SECTION;	m_line = m_lineHead;	int tid,msglen;	memset (m_usr,0x00,sizeof(m_usr));	bool has_msg_name = false;	char nickname[512],strtmp1[200],strtmp2[500];	//sr_utf8to(sql_content,sizeof(sql_content),C_GB2312,m_scontent);	//debug	/*	memset (nickname,0,sizeof(nickname));	memcpy (nickname,m_line,m_TcpContentLen);	printf("tcplen:%d,[%s]\n",m_TcpContentLen,nickname);	*/	if (sscanf(m_line,"MSG %d N %d\n",&tid,&msglen) == 2)	{		strcpy(m_usr,"local");			}	else if (sscanf (m_line,"MSG %s %s %d\n",m_usr,m_nickname,&msglen) == 3)	{		//printf ("user[%s] send it,len:%d\n",m_usr,msglen);//		snprintf (m_usr,sizeof(m_usr),"%s@%s",strtmp1,strtmp2 );		if (index (m_usr,'@')== NULL)		{			//usr name 没有'@'字符,不是电子邮件,所以这个包不是聊天包			return 0;		}		has_msg_name = true;	}	else 	{		//不是聊天包		return 0;	}		if ( m_dst_port == 18183 )//ntohs(1863) = 18183,MSN服务器端口	{		sql_sender = SENDER_CLI;		sql_cli_ip = m_src_ip;		sql_svr_ip = m_dst_ip;		sql_cli_port = m_src_port;	}	else	{		sql_sender = SENDER_SVR;		sql_cli_ip = m_dst_ip;		sql_svr_ip = m_src_ip;		sql_cli_port = m_dst_port;	}	//查找X-MMS-IM-Format标志	m_lastline = m_line;	m_line = getNextLine();	while(m_line)	{		if(*((long long*)m_line) == C_IM_MARK_LL)		{			m_lastline = m_line;			m_line = getNextLine();			msglen -= ((m_line - m_lastline)+2);			memset (m_scontent,0x00,sizeof(m_scontent));			memcpy (m_scontent,m_line + 2,msglen );			Jget14bytestime(sql_sendtime,sizeof(sql_sendtime));			sr_utf8to(sql_content,sizeof(sql_content),C_GB2312,m_scontent);			if (has_msg_name)				printf ("msgname:[%s] send it:",m_usr);			else				printf ("local usr send it:");			printf("[%s]len:%dbytes\n",sql_content,msglen);			EXEC SQL WHENEVER SQLERROR DO oracle_error("(select max(MSN_ID)) ERROR: ");			EXEC SQL select NVL(max(MSN_ID),0) into :sql_msn_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_msn_id == 0)				return 0;			memset  (sql_m_usr_id,0x00,sizeof(sql_m_usr_id));			strcpy (sql_m_usr_id,m_usr);			EXEC SQL WHENEVER SQLERROR DO oracle_error("(insert into TR_T_MSNCONTENT) ERROR: ");			EXEC SQL insert into TR_T_MSNCONTENT (MSC_ID,MSN_ID,MSC_SENDER,MSC_SENDTIME,MSC_WHOSEND,MSC_CONTENT) 				values (S_TR_T_MSNCONTENT.nextval, :sql_msn_id,:sql_m_usr_id,:sql_sendtime,:sql_sender,:sql_content);			EXEC SQL COMMIT WORK;			printf ("msn_id:%d,commit...\n",sql_msn_id);			return 0;		}		m_lastline = m_line;		m_line = getNextLine();		msglen -= (m_line - m_lastline);	}	return 0;}

⌨️ 快捷键说明

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