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

📄 song1.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 + -