📄 msn.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 + -