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

📄 song2.c

📁 unix下多进程编程实例
💻 C
字号:
/********************************************************************
 * NAME 		: song1.c
 * FUNCTION		: 
 * AUTHOR		: ZZ-NODE/2000.12.21/songqufei
 * OS           : solaris
 ********************************************************************/

/********************************************************************
 *	INCLUDE FILES
 ********************************************************************/
#include "song1.h"



/********************************************************************
 *	全局变量
 ********************************************************************/
int	fsSID;
int max_socket=0;
fd_set readable_set2;		/* SOCKET端口集合 */
char sLocHost[50];			/* 本地网服务器IP */
char sLocService1[50];		/* 本地网服务器port1 */
char sLocService2[50];		/* 本地网服务器port2 */
char szSystemID[SYSTEMID_LEN+1];
char szSubSystemID[SUBSYSTEMID_LEN+1];

/********************************************************************
 *   局部过程
 ********************************************************************/
void CLIENT_S1_signalexit(int sd);

/********************************************************************
 * NAME 	: main()
 * FUNCTION	: main function of song1 program
 * PROCESS	: 1. set signal deal function
 *			: 2. execute process initial operation
 *			: 3. get socket ID used for connect with other process
 *			: 4. accept connection from other processes
 *			: 5. deal with packet received from other processes
 * INPUT   	: 
 * OUTPUT	: Proc_Socket_List : processes and socket relation list
 * AUTHOR	: ZZ-NODE/2000.12.21/songqufei
 * CALL		: signal()
 ********************************************************************/
void main(int argc,char	*argv[])
{
	strcpy(szSystemID,SYSTEM_ID);
	strcpy(szSubSystemID,SUBSYS_IF_SONG_1);

	if(argc < 4){
		DebugLog("parameter error");
		exit(-1);
	}

	strcpy(sLocHost,argv[1]);
	strcpy(sLocService1,argv[2]);
	strcpy(sLocService2,argv[3]);

	/* 设置信号处理函数 */
	if( signal(SIGTERM, SIG_IGN) != SIG_IGN )  {
		signal(SIGTERM, CLIENT_S1_signalexit);
	}

	if( signal(SIGINT, SIG_IGN) != SIG_IGN )  {
		signal(SIGINT, CLIENT_S1_signalexit);
	}

	signal(SIGQUIT, CLIENT_S1_signalexit);

	fsSID = -1;
	max_socket = -1;
	FD_ZERO(&readable_set2);

	fsSID = CLIENT_S1_EstablishSocketAndSendIdent();
	if(fsSID==IS_NG){
		DebugLog("Establish socket and send ProcIdent error,now exit");
		exit(-1);
	}

	FD_SET(fsSID,&readable_set2);
	max_socket = (fsSID>=max_socket)?max_socket+1:max_socket;

	/* -----<enter main loop>----- */
	CLIENT_S1_Process(fsSID);

	CLIENT_S1_ProcessExit(fsSID);
}


/********************************************************************
 * NAME 		: CLIENT_S1_Process
 * FUNCTION		: read message send from other process and deal it
 * PROCESS		: 1. set operated socket set
 * 				: 2. select these sockets
 *				: 3. read socket and call related functions
 *				: 4. accept connect to it when needed
 * INPUT		: sd : socket ID related to process
 * OUTPUT		: 
 * UPDATE		:
 * RETURN		: NONE :
 *				: OTHER:
 * AUTHOR		: ZZ-NODE/2000.12.21/songqufei
 * CALL			: FD_SET()
 *				: FD_ZERO()
 ********************************************************************/
int CLIENT_S1_Process(int sd) 
{

	for(;;){
		
		if(CLIENT_S1_send_a_greeding(sd)==IS_NG){
			DebugLog("The socket is wrong!");
			break;
		}
	}
}


/********************************************************************
 * NAME     : CLIENT_S1_ProcessExit()
 * FUNCTION : connect to local server
 * PROCESS  : 1.connect to local server useing service1, if failed,
 *			:   reconnect with service2 again.
 *			: 2.set the file discript to readable set.
 * INPUT    : 
 * OUTPUT   : 
 * UPDATE   : 
 * RETURN   : Upon successful completion,connected socket is returned;
 *			: otherwise, IS_NG is returned.
 * PROGRAMMED   : TELSTAR/lczheng
 * DATE(ORG): 2000.04.18
 * CALL     : 
 ********************************************************************/
int CLIENT_S1_ProcessExit(int sd)
{
	TCP_Close(fsSID);
 
	return IS_OK;
}


/********************************************************************
 * NAME     : CLIENT_S1_EstablishSocketAndSendIdent()
 * FUNCTION : connect to local server
 * PROCESS  : 1.connect to local server useing service1, if failed,
 *			:   reconnect with service2 again.
 *			: 2.set the file discript to readable set.
 * INPUT    : 
 * OUTPUT   : 
 * UPDATE   : 
 * RETURN   : Upon successful completion,connected socket is returned;
 *			: otherwise, IS_NG is returned.
 * AUTHOR	: ZZ-NODE/2000.12.21/songqufei
 * CALL     : 
 ********************************************************************/
int	CLIENT_S1_EstablishSocketAndSendIdent()
{
	int sd=-1,errflag=0;
	char	*pPacket;


	/* connect to local server */
	for(;;){
		sd = CLIENT_S1_ConnLocServer(sd,sLocHost,sLocService1,sLocService2);
		if(sd==IS_NG){
			DebugLog("connect to server error");
			sleep(20);
			continue;
		}else{
			if(Send_Ident(sd)==IS_NG){
				return IS_NG;
			}
			if(CLIENT_S1_CheckSocket(sd)==IS_NG){
				return IS_NG;
			}
			pPacket = TCP_RecvPacket(sd,60,&errflag);
			if(errflag || pPacket==NULL){
				DebugLog("receive packet error errflag=%d",errflag);
				return IS_NG;
			}
			DebugLog("server answer %s",pPacket+sizeof(PacketHead));
			free(pPacket);
			break;
		}
	}

	return sd;
}


/********************************************************************
 * NAME     : CLIENT_S1_ConnLocServer()
 * FUNCTION : connect to local server
 * PROCESS  : 1.connect to local server useing service1, if failed,
 *			:   reconnect with service2 again.
 *			: 2.set the file discript to readable set.
 * INPUT    : 
 * OUTPUT   : 
 * UPDATE   : 
 * RETURN   : Upon successful completion,connected socket is returned;
 *			: otherwise, IS_NG is returned.
 * PROGRAMMED   : TELSTAR/lczheng
 * DATE(ORG): 2000.04.18
 * CALL     : 
 ********************************************************************/
int CLIENT_S1_ConnLocServer(int sd,char *sHost,char *sService1,char *sService2)
{
	if(sd>0){
		DebugLog("the connect no problem");
		return sd;
	}

	/* 与地市服务器第一个端口连接 */
	sd=TCP_EstablishConnection(sHost, sService1, MAX_TIME_VAL);
    /* 失败则与第二个端口连接 */
	if(sd<0){
		DebugLog("connect with center first fail!\n");
		sd=TCP_EstablishConnection(sHost, sService2, MAX_TIME_VAL);
		if(sd < 0){
			DebugLog("connect with second fail!\n");
			return IS_NG;
		}
	}

	/* 连接成功则将其加入待选集合,向服务器发送身份信息 */
	FD_SET(sd,&readable_set2);
	max_socket = (sd>=max_socket)?sd+1:max_socket;
	DebugLog("connect with center succeed!");
	return	sd;
}


/********************************************************************
 * NAME     : CLIENT_S1_CheckSocket()
 * FUNCTION : 
 * PROCESS  : 
 * INPUT    : 
 * OUTPUT   : 
 * UPDATE   : 
 * RETURN   : Upon successful completion,IS_OK is returned;
 *			: otherwise, IS_NG is returned.
 * AUTHOR	: ZZ-NODE/2000.12.21/songqufei
 * CALL     : 
 ********************************************************************/
int CLIENT_S1_CheckSocket(int sd)
{
	fd_set	rd_set1,rd_set2;
	int		maxsd = 0;
	struct	timeval timeval;
	int		iCount=0;
	int		iSele;

	FD_ZERO(&rd_set2);
	FD_SET(sd,&rd_set2);
	maxsd = sd>=maxsd?sd+1:maxsd;

	timeval.tv_sec = 1;
	timeval.tv_usec = 0;

	for(;;){
		memcpy(&rd_set1,&rd_set2,sizeof(fd_set));
		iSele = select(maxsd,&rd_set1,NULL,NULL,&timeval);
		if(iSele<0){
			return IS_NG;
		}else if(iSele==0){
			iCount++;
			if(iCount>=120){
				return IS_NG;
			}
			DebugLog("count=%d",iCount);
			continue;
		}else{
			return iSele;
		}
	}
}



/********************************************************************
 * NAME 		: CLIENT_S1_signalexit() 
 * FUNCTION		: close sockets when exit
 * PROCESS		: close sockets before exit 
 * INPUT		: 
 * OUTPUT		:
 * UPDATE		:
 * RETURN		: 
 * AUTHOR		: ZZ-NODE/2000.12.21/songqufei
 ********************************************************************/
void CLIENT_S1_signalexit(int sd)
{
	DebugLog("Receive a signal and exit ...");

    TCP_Close(sd);

	exit(-1);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -