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

📄 srv_s1_song1.c

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

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

/********************************************************************
 * 全局变量定义
 ********************************************************************/
int  sockID;   /* socket ID */

/********************************************************************
 *  内部函数
 ********************************************************************/
void SRV_S1_signalexit();

/********************************************************************
 * NAME 	: main()
 * FUNCTION	: main function of SRV_S1_song1 program
 * PROCESS	: 1.initialize socket 
 *		    : 2.send 身份信息 to 系统管理进程
 * INPUT	: argv[1] : offinum
 *			: argv[2] : JF machine IP
 *			: argv[3] : JF socket
 * OUTPUT	:
 * AUTHOR	: ZZ-NODE/2000.12.21/songqufei
 * CALL		: signal()
 *			: TCFVInitialize()
 *			: TCFVProcess()
 ********************************************************************/
void main(int argc,char *argv[])
{

	sockID = -1;

	sockID = atoi(argv[1]);
    strcpy(szSystemID,SYSTEM_ID);
    strcpy(szSubSystemID,SUBSYS_SV_SONG_1);
	giOutputLog = DebugLogOutputCtrl(argv[0]);

	if(argc<2) {
		DebugLog("Missing the parameter\n");
		exit(-1);
	}

	/* -----<set signal function>----- */
    if( signal(SIGTERM, SIG_IGN) != SIG_IGN )  {
		signal(SIGTERM, SRV_S1_signalexit);
	}

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


	Return_PacketHead(sockID,P_COM_SEND_IDENT,IS_OK);
    DebugLog("Send Connect OK");

	SRV_S1_Process();
	SRV_S1_ErrorDeal(IS_NG,SYSQUIT_TYPE);
}


/********************************************************************
 * NAME 		: SRV_S1_Process
 * FUNCTION		: deal with packet received
 * PROCESS		: 1. select socket
 *				: 2. test to determine if disconnect
 *				: 3. read socket data and deal with this data
 * INPUT		: 
 * OUTPUT		: 
 * UPDATE		: 
 * RETURN		: IS_NG : return because some problem
 * AUTHOR		: ZZ-NODE/2000.12.22/songqufei
 * CALL			: FD_ZERO()
 *				: FD_SET()
 *				: select()
 *				: TCFV_Read_Packet()
 *				: TCP_Close()
 ********************************************************************/
int SRV_S1_Process() 
{
	int max_socket;		     /* socket no used for select */
	fd_set readable_set;     /* readable set              */
	fd_set readable_set2;    /* readable set              */
	struct timeval time_val; /* used in set time value    */
	int	   readable_count;
	char   *pPacket;		 
	int    errflag;

	/* -----<initialize readable_set>----- */
	max_socket = sockID + 1;
	FD_ZERO(&readable_set2);
	FD_SET(sockID,&readable_set2);

	time_val.tv_sec  = MAX_TIME_VAL;
	time_val.tv_usec = 0;

	/* -----<loop for accept and socket read>----- */
    for(;;) {

      	memcpy(&readable_set,&readable_set2, sizeof(fd_set));

		readable_count = select(max_socket,&readable_set,NULL,NULL,&time_val);

		if(readable_count==0) { 
			continue;
		}
		
		if(readable_count<0) { /* select error */
			DebugLog("select error");
			break;
		}

		if(FD_ISSET(sockID,&readable_set)) {
			pPacket = TCP_RecvPacket(sockID,MAX_TIME_VAL,&errflag);
			if(errflag) {				/* socket is disconnect */
				DebugLog("Disconnect with JF prcess!");
				SRV_S1_ErrorDeal(IS_OK,COMMERR_TYPE);
				break;
			}
			if(pPacket != NULL) {
				SRV_S1_Read_Packet(sockID,pPacket);
				free(pPacket);
			}
		}

    }
	return IS_NG;
}


/********************************************************************
 * NAME     : SRV_S1_Read_Packet
 * FUNCTION : 
 * PROCESS  : 
 * INPUT    : 
 * OUTPUT   : 
 * UPDATE   : 
 * RETURN   : 
 * AUTHOR	: ZZ-NODE/2000.12.20/songqufei
 * CALL     : 
 ********************************************************************/
int SRV_S1_Read_Packet(int sockID,char *pPacket)
{
	PacketHead *pPacketHead;

	pPacketHead = (PacketHead *)pPacket;

	switch(pPacketHead->iPacketID) {
		case P_SONG1_SEND_GREEDING :
			DebugLog("Receive PacketID: P_COM_SEND_IDENT");
			SRV_S1_GET_a_greeding(sockID,pPacket);
			break;		
		default:
			DebugLog(" Unknow PacketID=%d",pPacketHead->iPacketID);
			Send_PacketHead(pPacketHead->iPacketID,ERROR_UNKNOWN_ID);
			break;
	}

	return IS_OK;
}




/********************************************************************
 * NAME 		: SRV_S1_signalexit() 
 * FUNCTION		: close sockets when exit
 * PROCESS		: close sockets before exit 
 * INPUT		: 
 * OUTPUT		: 
 * UPDATE		: 
 * RETURN		: 
 * AUTHOR		: ZZ-NODE/2000.12.22/songqufei
 * CALL			: SRV_S1_ErrorDeal() 
 ********************************************************************/
void SRV_S1_signalexit()
{
	DebugLog("Receive a signal and exit");
	
	SRV_S1_ErrorDeal(IS_NG,UNNOMAL_TYPE);
}

/********************************************************************
 * NAME 		: SRV_S1_ErrorDeal
 * FUNCTION		: system error deal
 * PROCESS		: 1. deal with error according error type
 *				: 2. rollback oracle operation
 * INPUT		: iErrno : error type
 * OUTPUT		: 
 * UPDATE		:
 * RETURN		: 
 * AUTHOR		: ZZ-NODE/2000.12.22/songqufei
 * CALL			: exit()
 ********************************************************************/
SRV_S1_ErrorDeal(int iErrno,int iErrVar)
{
    if(sockID>0) {
		TCP_Close(sockID);
    }
	ErrorLog(iErrVar,"SYSTEM","Process %s, exit",szSubSystemID);
	exit(iErrno);
}

⌨️ 快捷键说明

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