www.pudn.com > unixtonxunchengxu.rar > CommMain.c
//该程序在1号机运行,当与2号机建立连接后,一个进程继续监听,另创建两个进程。。 //一个负责向2号机发送数据,一个负责从2号机接收数据。 #include#include #include #include #include "UnionSocket.h" #include "UnionReg.h" #include "CommMsg.h" // Golobal variables definition int g_iSckHDL; int g_iBrotherPID; int g_iPortOfHost; TUnionIDOfMsgBuf g_iHostReqBuf; TUnionIDOfMsgBuf g_iHostResBuf; // Functions definition void 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 programs int 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); }