📄 cistomb.cpp
字号:
filelog(CIS_INTER_MB, "Connect count is max and disconnect client=[%s]", pMsSoket->clientIp); exit(-1); } sBepsPub.UpdateNumClient(ADD_CONNECT); int Xflag = 0; ret = sBepsPub.CheckSerail(&Xflag); if( Xflag != 0) { printf("system not permission exit\n"); exit(0); } printf("System start.....\n"); RecvBuf = ( char *)malloc(MAXBUFF*sizeof(char)); Result = ( char *)malloc(MAXBUFF*sizeof(char)); RetMsg = ( char *)malloc(100*sizeof(char)); conf = (CONF_VAL *)malloc( sizeof(CONF_VAL)); //配置的初始化 printf("System init ......\n"); curr_inf.workdir = getenv("HOME"); curr_inf.loglevel = atoi(myglobe->loglevel); sprintf( conf->confile, "%s/log/CisServer.log", getenv("WORKDIR")); curr_inf.logfile = conf->confile; time_t CurrTime, LastTime; CurrTime = LastTime = time(NULL); int MaxHeartMsgFail = 0; //子进程开始服务 printf("System start service....\n"); for(;;) { memset( RecvBuf, 0, sizeof(RecvBuf)); memset( RetMsg, 0, sizeof(RetMsg)); FD_ZERO(&rfds); FD_SET(fd, &rfds); ret = select(FD_SETSIZE,(fd_set*)&rfds, NULL, NULL, &timeout); if (ret < 0) { timeout.tv_sec = 0; timeout.tv_usec = 100; } else { timeout.tv_sec = 0; timeout.tv_usec = 0; } //验证如果套接有消息则接收消息 if (FD_ISSET(fd, &rfds)) { memset( RecvBuf , 0 , sizeof( RecvBuf )); //收取信息 可以处理阻塞 iRetval = pMsSoket->Recv(&RecvBuf, &RecvBufLen, &RetCode, &RetMsg); if ( iRetval != 0 && iRetval !=2 ) { sBepsPub.InitUserStatus(pMsSoket->clientIp); pMsSoket->Close(); sBepsPub.UpdateNumClient(DEL_CONNECT); disConnectToDB(); delete pMsSoket; free(RecvBuf); free(Result); free(RetMsg); free(conf); filelog(CIS_INTER_MB, "Disconnect from client and exit!\n"); printf("Disconnect from client and exit!\n"); exit(0); } //非法消息不处理 if( iRetval == 2) { memset( RecvBuf , 0 , sizeof( RecvBuf )); continue; } if(strlen(RecvBuf) > 0 ) { RecvBuf[RecvBufLen] = '\0'; printf("Recv = [%d][%s]\n", strlen(RecvBuf),RecvBuf); filelog(CIS_INTER_MB, "RecvBuff is:%s\n", RecvBuf); memset( SendBuf, 0, 10); memcpy(SendBuf,"000" , 3); memset( TrNo , 0 , sizeof( TrNo )); memcpy( TrNo , RecvBuf+11 , 5); printf("当前交易码 = [%s]\n", TrNo); ret = sBepsPub.CisServer( TrNo , RecvBuf, Result,sResDesc); if( ret <= 0 ) { errlog("交易处理失败[%s]\n",sResDesc); printf("交易处理失败[%s]\n",sResDesc); continue; } SendBufLen = strlen(Result); RetCode = atoi(SendBuf); //返回处理结果 iRetval = pMsSoket->Send(Result,sResDesc,SendBufLen, &RetCode,&RetMsg); if ( iRetval != 0 ) { pMsSoket->Close(); sBepsPub.UpdateNumClient(DEL_CONNECT); filelog(CIS_INTER_MB, "Send data failed and exit!\n"); printf("Send data failed and exit!\n"); continue; } else { break; } } else { printf("非法消息丢弃不处理\n"); continue; } } //每隔一分钟发送一次心跳消息 CurrTime = time(NULL); if((CurrTime-LastTime) >= 120) { if(0 != pMsSoket->SentHeartMsg("000010SND::HK; ")) { MaxHeartMsgFail++; } else { MaxHeartMsgFail=0; } LastTime = CurrTime; } //发送心跳失败的次数超过三次后进程退出 if(MaxHeartMsgFail >= 3) { sBepsPub.InitUserStatus(pMsSoket->clientIp); pMsSoket->Close(); sBepsPub.UpdateNumClient(DEL_CONNECT); disConnectToDB(); delete pMsSoket; free(RecvBuf); free(Result); free(RetMsg); free(conf); errlog("发送三次心跳消息失败,系统正常退出"); filelog(CIS_INTER_MB, "Send HeartMsg max times failed and exit!\n"); printf("Send HeartMsg max times failed and exit!\n"); exit(0); } ssleep(1*10000L); }}*///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 处理信号SIGTERM函数void CatchSigTerm(int sig){ myglobe->workFlag = FLAG_FORMEXIT;} ///////////////////////////////////////////////////////////////////////////////// 处理信号SIGCHLD函数void CatchChild(int sig){ pid_t pid; int stat; //通知内核在没有己终止子进程时不要阻塞 while((pid = waitpid(-1, &stat, WNOHANG)) > 0) { //修改该子进程对应的状态 myglobe->mutex->SetChiProInfoEx(pid, csDead); }} ///////////////////////////////////////////////////////////////////////////////// 处理信号SIGINT函数void CatchSigInt(int sig){ KillAllChilPro(); exit (0);}///////////////////////////////////////////////////////////////////////////////// 强行关闭所有进程int KillAllChilPro(){ int I; pid_t pid; for(I = 0; I < atoi(myglobe->chiProcCount); I++) { pid = myglobe->mutex->GetChiProPid(I); if(pid > 0) { kill(pid, 9); } } return 0;}///////////////////////////////////////////////////////////////////////////////// 初始化全局数据bool InitGlobeData(){ char sRetStr[261]; memset( sRetStr , 0 , sizeof( sRetStr )); //设置相关信号处理函数 signal(SIGINT, CatchSigInt); signal(SIGTERM, CatchSigTerm); if(!LoadConfig()) { errlog( "进程[CisServer]解析配置文件BepsSend.xml出错"); return false; } myglobe->workFlag = FLAG_RELOAD; //初始化互斥量 myglobe->mutex = new CMuTex(atoi(myglobe->chiProcCount)); return true;}///////////////////////////////////////////////////////////////////////////////// 监控系统工作标志int MonitorWorkFlag(){ //处理僵尸进程 signal(SIGCHLD, CatchChild); //轮询各子进程是否存在,如果不存在则关闭对应还存在的套接字 /*int pid = 0; for(int i=1; i<atoi(myglobe->chiProcCount); i++) { pid = myglobe->mutex->m_ChiInfo[i].m_chiPid; if(!myglobe->mutex->ChiProIsLive(pid)) { int socket = myglobe->mutex->m_ChiInfo[i].m_socket; if(socket != -1) { printf("Server is exit and disconect client\n"); comSocket->Close(socket); } } }*/ int result = 0; switch(myglobe->workFlag) { //正常流程 case FLAG_NORMAL: { break; } //重载配置 case FLAG_RELOAD: { break; } //进程退出 case FLAG_FORMEXIT: { KillAllChilPro(); disConnectToDB(); exit(0); } //未定义控制符 default: { break; } } return result;}// 从配置文件中读取配置参数bool LoadConfig(){ bool result = true; char conpath[50]; memset( conpath, 0x0, sizeof(conpath)); sprintf( conpath,"%s/etc/%s", getenv("WORKDIR"), CONFIGXML); myglobe->binconfig = new CBinConfig(conpath); result = myglobe->binconfig->IsReady(); if(result) { if(!(result = myglobe->binconfig->GetParameterValueByName("chiProcCount", myglobe->chiProcCount))) { printf("从XML中载入参数 [%s] 时出错\n", "chiProcCount"); } else if(!(result = myglobe->binconfig->GetParameterValueByName("loglevel", myglobe->loglevel))) { printf("从XML中载入参数 [%s] 时出错\n", "loglevel"); } else if(!(result = myglobe->binconfig->GetParameterValueByName("spasswd", myglobe->spasswd))) { printf("从XML中载入参数 [%s] 时出错\n", "spasswd"); } } printf("配置参数如下所示:\n"); printf("子进程的个数 [%s]\n", myglobe->chiProcCount); printf("与MBFE连接的密码 [%s]\n", myglobe->spasswd); printf("日志层次深度 [%s]\n", myglobe->loglevel); return result;}int connectToDB( char *dbname , char *username , char *passwd , char *wkname){ if(!m_clsSybServer.Open(dbname,username ,passwd)) { printf("连接数据库[%s][%s][%s]失败!\n",dbname,username,passwd); filelog(CIS_INTER_MB, "[CisToMb]连接数据库[%s][%s][%s]失败!\n",dbname,username,passwd); return -1; } if(!m_clsSybServer.SetWrkDb(wkname)) { printf("切换数据库[%s]失败!\n" , wkname); filelog(CIS_INTER_MB, "[CisToMb]切换数据库[%s]失败!\n" , wkname); return -1; } return 0;}int disConnectToDB(){ m_clsSybServer.Close(); return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -