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

📄 cistomb.cpp

📁 液晶电视完整代码可实现人机界面
💻 CPP
📖 第 1 页 / 共 2 页
字号:
        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 + -