📄 cistomb.cpp
字号:
#include "CisPub.hpp"#include "Com_lzser.h"#include "Com_wzser.h"/******************************************************************************* CisServer.bin的功能说明** 多进程管理** 接收从柜台发来的业务*****************************************************************************/#ifndef BOOL#endif#ifndef TRUE #define TRUE 1#endif//全局数据tagMyGlobe *myglobe = new tagMyGlobe;ComSocket_wzSer *comSendSocket;BepsPub sBepsPub;SybServer m_clsSybServer;int StrTrimChar( char *in_data ,char c){ int i,j = 0; char tmp[1024]; memset(tmp,0,sizeof(tmp)); for(i = 0;i < strlen(in_data);i++) { if(in_data[i] != c) tmp[j++] = in_data[i]; } strcpy( in_data , tmp); return TRUE;}/////////////////////////////////// 主函数int main(int argc, char* argv[]){ //显示其版本号 if(argc == 2 && (memcmp(argv[1], "-v", 2)==0||memcmp(argv[1], "-V", 2)==0)) { printf("System verison is: Direct CISInterworkMB CisToMb V002R003C010\n"); exit(0); } //使主进程成为守护进程 pid_t main_pid =0; main_pid = fork(); if(0 != main_pid) { exit(0); } printf("System verison is: Direct CISInterworkMB CisToMb V002R003C010\n"); printf("System init ......\n"); filelog(CIS_INTER_MB, "==============================[CisToMb]==============================\n" ); //调用初始全局数据函数 int iRetval; ComSocket_wzSer comSend; comSendSocket = &comSend; if(!InitGlobeData()) { filelog(CIS_INTER_MB, "[CisToMb] 初始全局失败,程序退出\n" ); printf( "[CISInterworkMB.bin] 初始全局失败,程序退出" ); exit (-1); } iRetval = comSendSocket->Open(); if(iRetval != 0) { filelog(CIS_INTER_MB, "[CisToMb]打开发送通讯端口失败, 程序退出\n"); printf( "[CISInterworkMB.bin]打开发送通讯端口失败, 程序退出"); exit(-1); } //连接数据库 char Password[20]; memset( Password , 0 , sizeof( Password )); strcpy( Password , getenv("PASSWORD")); char DBUserName[10]; memset( DBUserName , 0 , sizeof(DBUserName)); strcpy( DBUserName , getenv("DBUSERNAME")); StrTrimChar(DBUserName, ' '); if( strlen( DBUserName ) == 0 ) { strcpy( DBUserName , "sa"); } printf("DBUserName = [%s]\n", DBUserName ); int ret = connectToDB( "SYBASE" , DBUserName , Password , "DIRWAYSDB"); if( ret != 0 ) { printf( "[CISInterworkMB.bin]连接数据库失败, 程序退出"); filelog(CIS_INTER_MB, "[CisToMb]连接数据库失败, 程序退出\n"); exit(-1); } filelog(CIS_INTER_MB, "[CisToMb]连接数据库成功!\n"); //初始化本地成员 char sResDesc[MAX_MBFE_BUFFER]; char RecvBuf[MAXBUFF]; int RecvBufLen = 0, SendBufLen = 0;// char TrNo[7]; int RetCode = 0; char *RetMsg = 0; char msgData[MAX_MBFE_BUFFER]; char fixData[MAX_MBFE_BUFFER]; char pkgData[MAX_MBFE_BUFFER]; char msgContent[MAX_MBFE_BUFFER]; char msgId[6+1]; int dataIdx=0; RetMsg = ( char *)malloc(100*sizeof(char)); memset(RecvBuf, 0, MAXBUFF*sizeof(char)); memset(RetMsg, 0, 100*sizeof(char)); memset(msgData, 0, MAX_MBFE_BUFFER); memset(msgContent, 0, MAX_MBFE_BUFFER); memset(fixData, 0, MAX_MBFE_BUFFER); memset(pkgData, 0, MAX_MBFE_BUFFER); memset(msgId, 0, sizeof(msgId)); while(1) //开始服务 { if(0 != comSendSocket->Service()) { printf("通讯程序Service出错\n"); filelog(CIS_INTER_MB, "[CisToMb]通讯程序Service出错\n"); errlog( "File==>[%s],Line==>[%d]\n进程[CisToMb.cpp]通讯程序Service出错", __FILE__, __LINE__); comSendSocket->Close(); continue; } dataIdx=0; memset(msgData, 0, sizeof(msgData)); memset(fixData, 0, sizeof(fixData)); memset(msgContent, 0, sizeof(msgContent)); memset(pkgData, 0, sizeof(pkgData)); memset(sResDesc, 0, sizeof(sResDesc)); memset(msgId, 0, sizeof(msgId)); memset(RecvBuf, 0, sizeof(RecvBuf)); memset(RetMsg, 0, 100*sizeof(char)); //获取要发送到内行的来报业务 if(FALSE==sBepsPub.GetSendMBData(msgData, msgId, &dataIdx)) { sleep(1); continue; } printf("现在处理报文[%d][%s]发送行内\n", dataIdx, msgId); filelog(CIS_INTER_MB, "[CisToMb]现在处理报文[%d][%s]发送行内\n", dataIdx, msgId); /* if(FALSE==sBepsPub.GetMsgContent(msgData, msgContent)) { printf("报文内容非法\n"); sBepsPub.UpdSendMBDate(PROCESS_FAILED, &dataIdx); continue; }*/ //人行格转换成行内格式 if(0!=sBepsPub.DataChange(msgId, msgData, fixData, CNAPS)) { printf("TAG格式转换成FIXED格式失败\n"); filelog(CIS_INTER_MB, "[CisToMb]TAG格式转换成FIXED格式失败![%s][%s]\n", msgId, msgData); sBepsPub.UpdSendMBDate(PROCESS_FAILED, &dataIdx); continue; } if( strncmp( msgId , "CIS601" , 6 ) == 0 ) { char *Begin = NULL; char *End = NULL; char Tmp[28*1024]; memset( Tmp , 0 , sizeof(Tmp)); Begin = strstr( msgData , ":D89:"); End = strstr( Begin , "}"); memcpy( Tmp , Begin + 5 , End - Begin - 5); printf("D89 = [%s]\n", Tmp ); filelog("CIS601", "D89=[%d][%s]", strlen(Tmp), Tmp); strcat( fixData , Tmp ); }printf( "msgData:[%s]\n", msgData ); printf( "fixData:[%s]\n", fixData ); //拼写报文类型和报文内容发送到行内 strcpy(sResDesc, msgId);#if 0 //对于截留业务报文进行重构成PKG002报文 if(0==strcmp(msgId, "CIS100") || 0==strcmp(msgId, "CIS101")) { TCnapsTagMML *pMml = NULL; pMml = new TCnapsTagMML(); if(NULL == pMml) { filelog(CIS_INTER_MB, "Error:allocate memory failed"); comSendSocket->msocket_id = -1; comSendSocket->Close(); sBepsPub.UpdSendMBDate(PROCESS_FAILED, &dataIdx); exit(-1); } if(FALSE==sBepsPub.ParserTagToFix(msgId, msgContent, fixData, pMml)) { sBepsPub.UpdSendMBDate(PROCESS_FAILED, &dataIdx); printf("截留业务TAG转换成FIX失败"); delete pMml; continue; } delete pMml; filelog(CIS_INTER_MB, "Parser TAG data=[%d][%s]", strlen(msgContent), msgContent); filelog(CIS_INTER_MB, "Parser FIX data=[%d][%s]", strlen(fixData), fixData); if(FALSE==sBepsPub.FormatMsg(msgId, fixData, pkgData, sResDesc)) { sBepsPub.UpdSendMBDate(PROCESS_FAILED, &dataIdx); printf("重构截留业务失败:[%s]", sResDesc); continue; } strcat(sResDesc, pkgData); } else { strcat(sResDesc, fixData); }#endif strcat(sResDesc, fixData); SendBufLen = strlen(sResDesc); //确认消息长度大于报文类型的长度 if(SendBufLen>6) { //发送报文到行内 iRetval = comSendSocket->Send(sResDesc,NULL,SendBufLen, &RetCode,RetMsg); if ( iRetval != 0 ) { filelog(CIS_INTER_MB, "[CisToMb]Send data failed and close socket!"); printf("Send data failed and close socket!\n"); comSendSocket->msocket_id = -1; comSendSocket->Close(); sBepsPub.UpdSendMBDate(PROCESS_FAILED, &dataIdx); continue; } filelog(CIS_INTER_MB, "[CisToMb]sResDesc=[%d][%s]", strlen(sResDesc), sResDesc); /*报文处理成功更新标识*/ printf("\r\n 报文处理成功更新标识"); if(FALSE==sBepsPub.UpdSendMBDate(PROCESS_SUCCESS, &dataIdx, sResDesc)) { filelog(CIS_INTER_MB, "[CisToMb]Error:update doflag failed in file=[%d][%s]", __LINE__, __FILE__); comSendSocket->msocket_id = -1; comSendSocket->Close(); disConnectToDB(); exit(-1); } filelog(CIS_INTER_MB, "[CisToMb]Success process filein message"); } sleep(1); }}//子进程的处理函数//设置SOCKET为非阻塞方式//int flag = fcntl(pMsSoket->connfd, F_GETFL, 0);//fcntl(pMsSoket->connfd, F_SETFL, O_NONBLOCK|flag);/*void ChildProcess(){ filelog(CIS_INTER_MB, "Create process and accept client!"); //开始子进程的具体处理 ComSocket_wzSer *pMsSoket = NULL; pMsSoket = new ComSocket_wzSer; if(NULL == pMsSoket) { errlog( "[CisServer.bin] 分配空间失败!"); exit(-1); } //保存主进程当时接收的客户端的IP和套接字 pMsSoket->connfd = comSocket->connfd; memcpy(pMsSoket->clientIp, comSocket->clientIp, strlen(comSocket->clientIp)); int fd = pMsSoket->connfd; memcpy(sBepsPub.m_UserIpAddr, comSocket->clientIp, strlen(comSocket->clientIp)); fd_set rfds; timeval timeout; timeout.tv_sec = 0; timeout.tv_usec = 0; pid_t pid = getpid(); pid_t pgrp = getpgrp(); pid_t ppid = getppid(); pid_t pgid = getpgid(pid); printf("\nNew process info:pid=[%06d],gprp=[%06d],ppid=[%06d],pgid[%06d]\n", pid, pgrp, ppid, pgid); printf("Process ClientIP=[%s] Socket=[%d]\n", pMsSoket->clientIp, pMsSoket->connfd); char sResDesc[MAX_MBFE_BUFFER]; char SendBuf[10]; char *RecvBuf = 0; int RecvBufLen = 0, SendBufLen = 0; int Lock_Ret = 0; CURR_INF curr_inf; CONF_VAL *conf; int accflag, ret; char TrNo[7]; int RetCode = 0, iRetval = 0; char *RetMsg = 0,*Result = 0; char sysValue[21]; char resStr[100]; memset(sysValue, 0, 21); memset(resStr, 0, 100); accflag = 1; ret = connectToDB( "SYBASE" , "sa", "sybase" ,"DIRWAYSDB"); if( ret != 0 ) { delete pMsSoket; exit(-1); } if(FALSE==sBepsPub.GetSysCtlPar(NUM_CONNECT, sysValue, resStr)) { printf("%s\n", resStr); delete pMsSoket; exit(-1); } filelog(CIS_INTER_MB, "sysValue=[%s] sysConfig=[%s]", sysValue, myglobe->chiProcCount); if(atoi(sysValue)>atoi(myglobe->chiProcCount)) { pMsSoket->SentHeartMsg("000009NOCONNECT"); pMsSoket->Close(); disConnectToDB();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -