📄 commmain.c
字号:
//该程序在1号机运行,当与2号机建立连接后,一个进程继续监听,另创建两个进程。。//一个负责向2号机发送数据,一个负责从2号机接收数据。#include <stdio.h>#include <string.h>#include <stdlib.h>#include <signal.h>#include "UnionSocket.h"#include "UnionReg.h"#include "CommMsg.h"// Golobal variables definitionint g_iSckHDL;int g_iBrotherPID;int g_iPortOfHost;TUnionIDOfMsgBuf g_iHostReqBuf;TUnionIDOfMsgBuf g_iHostResBuf;// Functions definitionvoid DealSigUsr1();void DealSigUsr2();int InitializeResource(){ int iRet; if ((iRet = UnionInitHostMsgCommCFG()) != 0) { UnionUserErrLog("in InitializeResource::UnionInitHostMsgCommCFG Failure! iRet = [%d]\n",iRet); return(iRet); } else UnionLog("in InitializeResource::UnionInitHostMsgCommCFG OK!\n"); g_iHostReqBuf=UnionInitializeMessageBuffer(UnionGetUserIDOfReqBufForHost()); if (g_iHostReqBuf < 0) { UnionUserErrLog("in InitializeResource::UnionInitializeMessageBuffer Failure! return = [%d]\n",g_iHostReqBuf); return(iRet); } g_iHostResBuf=UnionInitializeMessageBuffer(UnionGetUserIDOfResBufForHost()); if (g_iHostResBuf < 0) { UnionUserErrLog("in InitializeResource::UnionInitializeMessageBuffer Failure! return = [%d]\n",g_iHostResBuf); return(iRet); } return(0);}int ReleaseResource(){ return(0);}int main(int argc,char *argv[]){ int iRet; if (argc != 2) { printf("Usage:: CommMain PortOfListen\n"); return(-1); } if (atoi(argv[1]) <= 0) { printf("Port of host listen QZJ [%s] is error!\n",argv[2]); return(-3); } g_iPortOfHost = atoi(argv[1]); if (UnionCreateProcess() > 0) return(0); UnionIgnoreSignals(); signal(SIGUSR1,DealSigUsr1); if ((iRet=InitializeResource()) != 0) { UnionUserErrLog("in main:: InitializeResource! return=[%d]\n",iRet); return(-1); } if ((iRet = UnionTCPIPServer(g_iPortOfHost,regName,UnionTCPIPTaskServer)) < 0) UnionUserErrLog("in main:: UnionTCPIPServer Failure! return=[%d]\n",iRet); else iRet = 0; ReleaseResource(); return(iRet);}int UnionTCPIPTaskServer(int iSocketID,char *pIPAddr,int iPort){ int iRet,iPID,iBreak=0; UnionSuccessLog("in UnionTCPIPTaskServer:: Client [%s] [%d] is connected now!\n",pIPAddr,iPort); g_iSckHDL = iSocketID; for (;;) { g_iBrotherPID = getpid(); // Set Father Process as Brother Process of Child Process. if ((iPID = UnionCreateProcess()) > 0) // Father Process responsible for sending message to snet. { g_iBrotherPID = iPID; // Set Child Process as Brother Process of Father Process. if ((iRet = UnionSendMessageToQZJ()) < 0) { UnionUserErrLog("in UnionTCPIPTaskServer:: UnionSendMessageToQZJ! return=[%d]\n",iRet); } //UnionKillTaskByProcID(g_iBrotherPID); // 通知兄弟进程退出 kill(g_iBrotherPID,SIGUSR1); UnionSuccessLog("in UnionTCPIPTaskServer:: Parent process: Send SIGUSR1 to brother process [%d]\n",g_iBrotherPID); iBreak = 1; } else if (iPID == 0) { if ((iRet = UnionReceiveMessageFromQZJ()) < 0) { UnionUserErrLog("in UnionTCPIPTaskServer:: UnionReceiveMessageFromQZJ! return=[%d]\n",iRet); } //UnionKillTaskByProcID(g_iBrotherPID); // 通知兄弟进程退出。 kill(g_iBrotherPID,SIGUSR1); UnionSuccessLog("in UnionTCPIPTaskServer:: Child process: Send SIGUSR1 to brother process [%d]\n",g_iBrotherPID); iBreak = 1; } else { UnionUserErrLog("in UnionTCPIPTaskServer:: UnionCreateProcess fail! return=[%d]\n",iPID); continue; } if (iBreak == 1) break; } return(iRet);} int UnionSendMessageToQZJ(){ int iRet,iLenOfMsg; unsigned char caSendBuf[1024]; for (;;) { UnionLog("in UnionSendMessageToQZJ:: Waiting receive [%ld] type of message from Host...\n",UnionGetMsgTypeForHostComm()); memset(caSendBuf,0,sizeof(caSendBuf)); // 从主机的响应消息队列中读出需要发送到2号机的交易包 iLenOfMsg=UnionGetSpecifiedMessageFromBuffer(g_iHostResBuf,UnionGetMsgTypeForHostComm(),&caSendBuf[2]); if (iLenOfMsg < 0) { UnionUserErrLog("in UnionSendMessageToQZJ:: UnionGetSpecifiedMessageFromBuffer! return=[%d]\n",iLenOfMsg); continue; } UnionLog("in UnionSendMessageToQZJ:: Receive [%d] bytes from host message buffer=[%s]\n",iLenOfMsg,&caSendBuf[2]); caSendBuf[0] = iLenOfMsg/256; caSendBuf[1] = iLenOfMsg%256; if ((iRet = UnionSendToSocket(g_iSckHDL,(unsigned char *)caSendBuf,iLenOfMsg+2)) < 0) { UnionUserErrLog("in UnionSendMessageToQZJ:: UnionSendToSocket! return=[%d]\n",iRet); break; } UnionLog("in UnionSendMessageToQZJ:: Send the host message to QZJ successfully!\n"); } UnionCloseSocket(g_iSckHDL); return(-1);}int UnionReceiveMessageFromQZJ(){ int iRet,iMsgLen; char caHostTime[10],caBuf[10]; unsigned char caRecvBuf[1024]; for (;;) { UnionLog("in UnionReceiveMessageFromQZJ:: Waiting receive message from QZJ...\n"); memset(caRecvBuf,0,sizeof(caRecvBuf)); if ((iRet = UnionReceiveFromSocketUntilLen(g_iSckHDL,caRecvBuf,2)) != 2) { UnionUserErrLog("in UnionReceiveMessageFromQZJ:: UnionReceiveFromSocketUntilLen fail! Received bytes=[%d], Expected bytes=[2]\n",iRet); break; } iMsgLen = caRecvBuf[0]*256 + caRecvBuf[1]; UnionLog("in UnionReceiveMessageFromQZJ:: Receive buffer length = [%02x %02x] [%d]\n",caRecvBuf[0],caRecvBuf[1],iMsgLen); if ((iRet = UnionReceiveFromSocketUntilLen(g_iSckHDL,caRecvBuf,iMsgLen)) != iMsgLen) { UnionUserErrLog("in UnionReceiveMessageFromQZJ:: UnionReceiveFromSocketUntilLen fail! Received bytes=[%d], Expected bytes=[%d]\n",iRet,iMsgLen); break; } UnionLog("in UnionReceiveMessageFromQZJ:: Receive [%d] bytes from QZJ=[%s]\n",iMsgLen,caRecvBuf); // 置换交易请求包中的交易时间为主机的系统时间 memset(caHostTime,0,sizeof(caHostTime)); memset(caBuf,0,sizeof(caBuf)); UnionGetSystemTime(caBuf); memcpy(caHostTime,caBuf,2); caHostTime[2]=':'; memcpy(&caHostTime[3],&caBuf[2],2); caHostTime[5]=':'; memcpy(&caHostTime[6],&caBuf[4],2); memcpy(&caRecvBuf[73],caHostTime,8); UnionLog("in UnionReceiveMessageFromQZJ:: Host time = [%s][%s]\n",caBuf,caHostTime); // 将从2号机接收到的交易包发送到主机的请求消息队列 iRet=UnionAddMessageToBuffer(g_iHostReqBuf,UnionGetMsgTypeForHostComm(),(unsigned char *)caRecvBuf,iMsgLen); if (iRet != 0) { UnionUserErrLog("in UnionReceiveMessageFromQZJ:: UnionAddMessageToBuffer! return=[%d]\n",iRet); continue; } UnionLog("in UnionReceiveMessageFromQZJ:: Send the QZJ message to host message buffer successfully!\n"); } UnionCloseSocket(g_iSckHDL); return(-1);}void DealSigUsr1(){ UnionLog("in DealSigUsr1:: Task Received SigUsr1!\n"); UnionCloseSocket(g_iSckHDL); ReleaseResource(); exit(-1);}// Functions called by other programsint UnionUnregisterTask(){ return(0);}int UnionRegisterTask(char *fmt,...){ return(0);}int UnionCreateProcess(){ int i; int pid; for (i=0;i<3;i++) { if ((pid = fork()) != -1) break; else { UnionSystemErrLog("in UnionCreateProcess:: fork!\n"); usleep(20); } } return(pid);}int UnionIgnoreSignals(){ setsid(); signal(SIGALRM,SIG_IGN); signal(SIGINT,SIG_IGN); signal(SIGQUIT,SIG_IGN); signal(SIGHUP,SIG_IGN); signal(SIGCLD,SIG_IGN); return(0);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -