📄 hostser.ec
字号:
/* HostSer.c: * * this routine and HostSerDo.c are used for simulate * the Branch Host * */#include <procinfo.h>#include <fcntl.h>#include <sys/types.h>#include <string.h>#include <stdio.h>#include <signal.h>#include <errno.h>#include <sys/socket.h>#include <sys/time.h>#include <netinet/in.h>#include "../incl/HostSer.h"#include "../incl/bank.h"extern void GetItem(char *sSour, char *sOut, int iNum);int host_ip1;int host_ip2;int host_ip3;int host_ip4;int host_port;long test=1;SEND_NET send_net;WORKER *wk;int htime_out1;int outloop;$char stockdb1[1024+1];/******JYM *jym;char hostlog[30];char host_ls[7];jmp_buf oldenv;******/extern void pktonet_stock(char * snd_temp);main(argc,argv)int argc;char *argv[];{ int sockfd,newsockfd,addrlen; size_t clilen; int childpid,Host_code; char snd_data_package[1024]; char package[1024+1]; struct sockaddr_in serv_addr,cli_addr; int iProcNumber=0; int iMaxProcNumber=0; if(argc != 1){ fprintf(stderr,"Usage:HostSer \n"); WriteLog( LOGFILE, "HostSer usage err!"); exit(-1); } iMaxProcNumber=GetMaxProcNumber(); if ( iMaxProcNumber < 0 ) { fprintf(stderr,"GetMaxProcNumber error !\n"); WriteLog( LOGFILE, "GetMaxProcNumber error !"); exit(-1); } memset(stockdb1,0,sizeof(stockdb1)); if ( GetDatabaseName(stockdb1) < 0 ) { fprintf(stderr,"GetDatabaseName error !\n"); WriteLog( LOGFILE, "GetDatabaseName error!"); exit(-1); } if ( GetHostCfg() < 0 ) { fprintf(stderr,"GetHostCfg error !\n"); WriteLog( LOGFILE, "GetHostCfg error!"); exit(-1); } if ( init_tohost() < 0 ) { fprintf(stderr,"init_tohost error !\n"); WriteLog( LOGFILE, "init_tohost error !"); exit(-1); } signal(SIGCLD,SIG_IGN); signal(SIGHUP,SIG_IGN); signal(SIGPIPE,SIG_IGN); if ((sockfd=socket(AF_INET,SOCK_STREAM,0)) == -1) { fprintf(stderr,"server socket error\n"); WriteLog( LOGFILE, "HostSer Socket err!"); exit(-1); } bzero( (char *)&serv_addr,sizeof(serv_addr)); serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = INADDR_ANY; serv_addr.sin_port = htons(PORT); if ( bind(sockfd,(struct sockaddr*)&serv_addr,sizeof(serv_addr)) == -1 ) { fprintf(stderr,"HostSer bind error\n"); WriteLog( LOGFILE, "HostSer Socket Band err!"); exit(-1); } if ( listen(sockfd,5) == -1) { fprintf(stderr,"server listen error\n"); WriteLog( LOGFILE, "HostSer Socket Listen err!"); exit(-1); } clilen = sizeof(cli_addr); fprintf(stderr,"HostSer listening on port %d\n",PORT); $ connect to $stockdb1; if ( sqlca.sqlcode ) { WriteLog( LOGFILE, "Open database stock err![%d]\n",sqlca.sqlcode ); exit( -1 ); } EXEC SQL UPDATE t_worker_sign SET on_off = "0"; if(sqlca.sqlcode) { WriteLog( LOGFILE, "Update database stock err![%d]\n",sqlca.sqlcode ); $ disconnect current; exit( -1 ); } $ disconnect current; if ( sqlca.sqlcode ) { WriteLog( LOGFILE, "close database stock err![%d]\n",sqlca.sqlcode ); exit( -1 ); } for(;;){ newsockfd = accept(sockfd,(struct sockaddr *)&cli_addr,&clilen); if ( newsockfd == -1 ) { fprintf(stderr,"HostSer accept error:%d\n",errno); WriteLog(LOGFILE, "HostSer Socket Accept err!"); continue; } iProcNumber=GetProcNumber(); WriteLog(LOGFILE,"Current Process Number = [%d]",iProcNumber); if ( iProcNumber > iMaxProcNumber ) { strcpy ( send_net.retcode, "8999" ); strcpy ( send_net.errmsg,"系统忙,请稍后提交"); memset(snd_data_package,0,sizeof(snd_data_package)); pktonet_stock(snd_data_package); WriteLog(LOGFILE, "系统错误,向代理集中点发送:\n[%s]",snd_data_package); SockSnd( newsockfd ,snd_data_package ); close(newsockfd); sleep(1); continue; }/***** test++;*****/ if( (childpid=fork())<0 ) { fprintf(stderr,"HostSer fork error!!!\n"); WriteLog(LOGFILE, "HostSer fork err!"); } else if( childpid==0 ) { char out[10] ="10"; setsockopt(newsockfd,SOL_SOCKET,SO_LINGER,out,sizeof(SO_LINGER)); close(sockfd); memset(package,0,sizeof(package)); memset(&send_net,0,sizeof(SEND_NET)); if( HostSerDo(newsockfd,package) == 0) { WriteLog(LOGFILE,"向代理集中点发送:\n[%s]",package); SockSnd( newsockfd ,package ); } else { if ( strlen(send_net.retcode) == 0 ) { strcpy ( send_net.retcode, "8999" ); strcpy ( send_net.errmsg,"系统错误"); } memset(snd_data_package,0,sizeof(snd_data_package)); pktonet_stock(snd_data_package); WriteLog(LOGFILE, "系统错误,向代理集中点发送:\n[%s]",snd_data_package); SockSnd( newsockfd ,snd_data_package ); } sleep(1); close(newsockfd); exit(0); } close(newsockfd); } end_tohost(); close(sockfd);}void pktonet_stock(char * snd_temp){ int lenb,len; int i; char tmp[1024],lenstr[2]; char *temp; memset ( tmp,0,1024 ); temp = tmp; len = 0; lenb = strlen(send_net.retcode); memcpy ( temp,"RETCODE=",8 ); for ( i=0; i<8; i++ ) *temp ++; memcpy ( temp,send_net.retcode,lenb); for ( i=0; i<lenb; i++ ) *temp ++; memcpy ( temp,"|",1 ); *temp++; len=len+lenb+9; lenb = strlen(send_net.errmsg); memcpy ( temp,"ERRMSG=",7 ); for ( i=0; i<7; i++ ) *temp ++; memcpy ( temp,send_net.errmsg,lenb); for ( i=0; i<lenb; i++ ) *temp ++; memcpy ( temp,"|",1 ); *temp ++; len=len+lenb+8; temp[len] = '\0'; memcpy ( snd_temp, "03" , 2 ); sprintf(lenstr,"%2d",len); memcpy ( snd_temp+2,lenstr , 2 ); memcpy ( snd_temp+4,tmp,sizeof(tmp)); return ;}int GetProcNumber(){ int i,count; pid_t indexPointer; struct procsinfo procBuff[10]; struct fdsinfo fileBuff[10]; int procSize; int fileSize; int rtnNumber; char *pTemp; procSize = sizeof(struct procsinfo ); fileSize = sizeof(struct fdsinfo ); indexPointer = 0; rtnNumber = 10; count = 0; while( rtnNumber == 10 ) { rtnNumber = getprocs(procBuff, procSize, fileBuff, fileSize, &indexPointer,10 ); for(i=0;i<rtnNumber;i++) if(strcmp(procBuff[i].pi_comm,"HostSer")==0) count ++; } return count;}int GetMaxProcNumber(){ FILE *pFp; char aczFileName[1024+1]; char aczLine[1024+1]; memset(aczFileName,0,sizeof(aczFileName)); sprintf(aczFileName,"%s/etc/MaxProcNum.cfg",getenv("WORKDIR")); pFp=fopen(aczFileName,"r"); if ( pFp == NULL ) return -1; memset(aczLine,0,sizeof(aczLine)); if ( fgets(aczLine,1024,pFp) == NULL ) { fclose(pFp); return -1; } fclose(pFp); WriteLog( LOGFILE, "MaxProcNumber=[%d]",atoi(aczLine)); return atoi(aczLine);}int GetDatabaseName(char * pcDatabaseName){ FILE *pFp; char aczFileName[1024+1]; char aczLine[1024+1]; memset(aczFileName,0,sizeof(aczFileName)); sprintf(aczFileName,"%s/etc/db.cfg",getenv("WORKDIR")); pFp=fopen(aczFileName,"r"); if ( pFp == NULL ) return -1; memset(aczLine,0,sizeof(aczLine)); if ( fgets(aczLine,1024,pFp) == NULL ) { fclose(pFp); return -1; } fclose(pFp); strncpy(pcDatabaseName,aczLine,strlen(aczLine)-1); WriteLog( LOGFILE, "DatabaseName=[%s]",pcDatabaseName); return 0;}int GetHostCfg(){ FILE *pFp; char aczFileName[1024+1]; char aczLine[1024+1]; char tmp[1024+1]; memset(aczFileName,0,sizeof(aczFileName)); sprintf(aczFileName,"%s/etc/host.cfg",getenv("WORKDIR")); pFp=fopen(aczFileName,"r"); if ( pFp == NULL ) return -1; memset(aczLine,0,sizeof(aczLine)); if ( fgets(aczLine,1024,pFp) == NULL ) { fclose(pFp); return -1; } memset(tmp,0,sizeof(tmp)); GetItem(aczLine,tmp,1); host_ip1=atoi(tmp); memset(tmp,0,sizeof(tmp)); GetItem(aczLine,tmp,2); host_ip2=atoi(tmp); memset(tmp,0,sizeof(tmp)); GetItem(aczLine,tmp,3); host_ip3=atoi(tmp); memset(tmp,0,sizeof(tmp)); GetItem(aczLine,tmp,4); host_ip4=atoi(tmp); memset(aczLine,0,sizeof(aczLine)); if ( fgets(aczLine,1024,pFp) == NULL ) { fclose(pFp); return -1; } host_port=atoi(aczLine); fclose(pFp); WriteLog( LOGFILE, "HostCfg=[%d.%d.%d.%d]:[%d]", host_ip1, host_ip2, host_ip3, host_ip4, host_port); return 0;}void GetItem(char *sSour, char *sOut, int iNum){ int iCycleVar; int iCurNum=0; int iBegin=0; for(iCycleVar=0;iCycleVar<strlen(sSour);iCycleVar++) { if ( *(sSour+iCycleVar) != '.' ) { *(sOut+iBegin) = *(sSour+iCycleVar); iBegin++; } else { iCurNum ++ ; if ( iCurNum == iNum ) return; else { iBegin=0; memset(sOut,0,strlen(sOut)); } } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -