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