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);
}