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