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

📄 commmain.c

📁 这是个unix环境下的通讯程序
💻 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 + -