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

📄 isap_client.cpp

📁 unix环境下的多进程方式应用程序编程示例应用
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <signal.h>
#include <baseobj.h>
#include <samrtbpacket.h>
#include <samrtbdict.h>
#include <samdictdef.h>
#include <sampacketdef.h>
#include <get_dhcs.h>

#include <obsclientdef.h>
#include <obsclientconn.h>
#include <obsclientdb.h>
#include <sampacket.h>
#include <math.h>

int  global_num = 5; //max process number  // add by mmx
int  min_sid=20000; //min sid,sender_id,recieve_id  //add by mmx &crt
int  max_sid=29999; //max sid,sender_id,recieve_id  //add by mmx &crt
int  current_sid;    //current sid,sender_id,recieve_id  //add by mmx &crt
pid_t  g_childpid = -1;
FILE * myfp;
char MyFileName[100];
long sj=0;
int process_num ; ////add by mmx
struct tm *mytime;


void handler(int sig)  //add by mmx &crt 用于避免僵死进程
{int pid,stat;
 
  //printf("Now global_num is %d\n",global_num);
  while((pid=waitpid(0,&stat,WNOHANG))>0)
	 {  process_num--;
	 	printf("process %d is already releaseed  , retrun value is %d \r\n",pid,stat);
}
}

char myappName[100];
/*从源字符串SSTR第START字符起,取一个字符串(空格分开)到目的串DSTR,并返回下一字段开始位置*/
int getstr(char * sstr,char * dstr,int start)
{ 
  int i,k,l;
  
  l=0;
  dstr[0]=0;
  for(k=start;k<strlen(sstr);k++){ if (sstr[k]!=' ') break;}
  
  for(i=k;i<=strlen(sstr);i++){
     if ((sstr[i]==' ') || (sstr[i]=='\0') || (sstr[i]=='\n') || (sstr[i]=='\r')){dstr[l]=0;break;}
     dstr[l]=sstr[i];l++;
     }
  return i;       
}

int pc_live(char * appName)   //函数:用于判断程序是否在运行中  by crt &zkx
{
  int js=0,bs=0,k=0;
  char nr[500];
  FILE * fp;
  char cmd[500];
  char progname[200];
  
  sprintf(cmd,"ps -e|grep %s",appName);
  fp=popen(cmd,"r");
  
  if (fp == NULL)
    {
       printf("%s 无此文件\n",appName);
       return bs;
    }
  else 
  {
      while(fgets(nr,250,fp)!=NULL)
        {
            k=getstr(nr,progname,0);
            k=getstr(nr,progname,k);
            k=getstr(nr,progname,k);
            k=getstr(nr,progname,k);/*空读,第4字段是程序名字*/
            if(strcmp(progname,appName)==0)
                {js++;
               
                if(js>1)
                  {
                   bs=1;
                   break;
                  }
                }         
        }
      pclose(fp);
      return bs;
   }
}

//---- Added by zkx   &crt ----
int p_nanosleep(useconds_t useconds)
{
	struct timespec tmsp;
	//time_t		tv_sec;		/* seconds */
	//long		tv_nsec;	/* and nanoseconds */
	tmsp.tv_sec = floor(useconds / 1000000);
	tmsp.tv_nsec = (useconds % 1000000) * 1000;
	int ret = ::nanosleep(&tmsp, NULL);
	if(ret != 0)
	{
		printf("::nanosleep() failed, because : ");
		switch(errno)
		{
		case EINTR:
			printf("interrupted by a signal.\n"); break;
		case EINVAL:
			printf("argument are invalid.\n"); break;
		case ENOSYS:
			printf("not supported by system.\n"); break;
		}
	}
	return ret;
}
//------ END ------

//global debug variable
RUNMODE_t runmode;

int obscommand(int argc, char* argv[]);
int readDHCS(const char* cFileName,char* cUser,char* cPasswd,char* cHostString);
int readCfgInfo(const char* cCfgFile,OBSCfgInfo &obsclient);
int getReponsetResult(CSamPacket &response,long &result,long &errorCode,COBSClientDB &clientDB);
void usage(const char* appName);
int writePidFile(char* fileName,pid_t pid);
int deletePidFile(char* fileName);
extern "C" void getStopSignal(int s);
extern "C" void backJob(int s);

int main(int argc,char* argv[])
{
	signal(SIGINT,getStopSignal);
	signal(SIGTERM,backJob);
	signal(SIGSTOP,backJob);
	signal(SIGKILL,backJob);
	//signal(SIGCHLD,handler); //add by mmx

       pid_t  pid; 
       pid_t  spid; 
       int    status;
#ifdef WIN32
    WORD	wVersionRequested;
	WSADATA	wsaData;
	wVersionRequested = MAKEWORD(2, 0);
	if(WSAStartup(wVersionRequested, &wsaData) != 0) {
		printf("Err: Cannot startup windows sockets\n");
		return -1;
	}
#else
#endif
        char argval;
        char* appName= *argv++; 
        if (pc_live(appName)==1)
           { 
           	printf("ERROR:  %s is existence!!!\n",appName);
                exit(2);
           }
        sprintf(MyFileName,"%s%s",appName,".log");
        if(argc != 2)
        {
          usage(appName);
          exit(-1);
        }
        argc--;
        while (argc) {
            if (**argv != '-') {
              exit(-1);
            }
            argval = *(*argv + 1);
            argc--;
            argv++;
            switch (argval) {
                case 'd':
                case 'D':
                  runmode = DEBUG_MODE;
                  break;
                case 'h':
                case 'H':
                  if (0 == argc) {
                     usage(appName);
                     exit(0);
                  }
                  argc--;
                  argv++;
                  break;
                case 'b':
                case 'B':
                  runmode = BACKGROUND_MODE;
                  break;
                default:
                  exit(-1);
            } 
        }

        pid=fork();
        if(pid==0)
        {
           if(runmode == BACKGROUND_MODE)
           {
             spid=setsid();
             writePidFile((char*) PIDFILE,spid);
           }
           pid=getpid(); 
           if (runmode == DEBUG_MODE)
           {
             printf("Msg:OBSCLIENT current pid:%d.\n",pid);
             writePidFile((char*) PIDFILE,pid);
           }
           obscommand(argc, argv);
        }

		g_childpid = pid;

        if(runmode == DEBUG_MODE)
          if(wait(&status) != pid)
            printf("Msg:Can't wait for child process:%d.\n",pid);
        //deletePidFile((char* ) PIDFILE);

#ifdef WIN32
	// Cleanup Winsock dlls
	WSACleanup();
#else
#endif

 return 0;

}

int obscommand(int argc,char* argv[])
{
  OBSCfgInfo clientCfg;
  COBSClientDB clientDB;
  CSamPacket sendPacket;
  CSamPacket recvPacket;
  CSamSClientConnection clientTcp;
  CSamRtbDict obsDict;  
  int nCode=OBSREQ;
  int nSubCode;
  char dbuser[128];
  char dbpasswd[128];
  char dbhost[128];
  char _tmp_BusinessID[18];//add by mmx
  char packetBuf[PACKETLEN];
  char *cRecvBuf=NULL;
  int nPacketLen;
  int nOcts;
  int nsendOcts;
  int nrecvOcts;
  long nresult;
  long nerrorcode;
  u_char nrespstatus;
  u_long sendpacketid=0;
  u_long recvpacketid=0;
  obsDict.setFileName((char*) DICTFILE);
  int child_pid;   //add by mmx

  
  int DBStatus;
   
  signal(SIGINT,SIG_IGN);  
  signal(SIGTERM,SIG_IGN);  
  signal(SIGSTOP,SIG_IGN);  
  signal(SIGKILL,SIG_IGN);  
  signal(SIGCHLD,SIG_IGN); //add by mmx &crt
  

  if(obsDict.dict_init())
  {
    if (runmode == DEBUG_MODE)
      printf("Msg:Can't init dict.\n");
    return 0;	
  }
  else
    if (runmode == DEBUG_MODE)
      printf("Msg:Init data dictionary.\n");
  
  recvPacket.setDict((CSamRtbDict*) &obsDict);
  if(!readCfgInfo(CLIENTCFGFILE,clientCfg))
  {
    if (runmode == DEBUG_MODE)
      printf("Msg:Can't open client configure file %s.\n",CLIENTCFGFILE);
    return 0;
  }


   global_num=clientCfg.global_num;  
   min_sid   =clientCfg.min_sid;  
   max_sid   =clientCfg.max_sid;  
   current_sid=min_sid;   


  if(get_dhcs(dbuser,dbpasswd,dbhost,(char*) DBCONNFILE))
  {
    if (runmode == DEBUG_MODE)
      printf("Msg:Can't find file %s.\n",DBCONNFILE);
    return 0;
  }
  clientDB.setDB(dbuser,dbpasswd,dbhost);
  if(!clientDB.initDB())
  {
    if(runmode == DEBUG_MODE)
      printf("Msg:Can't connect DB.\n");
    return 0;	
  }
  else
    if(runmode == DEBUG_MODE)
      printf("Msg:Connected Database.\n");
    
  clientTcp.setSamSClientCfg(clientCfg.port,clientCfg.ipaddr,clientCfg.sendwait,clientCfg.recvwait);    

    if(runmode == DEBUG_MODE)
     printf("Msg:setSamSClientCfg ok.\n");

  int s;
  signal(SIGINT,getStopSignal);  
  signal(SIGTERM,backJob);  
  signal(SIGSTOP,backJob);  
  signal(SIGKILL,backJob);  
  signal(SIGCHLD,handler); //add by mmx & zkx
  while(1)
  {
  	if ((myfp=fopen(MyFileName,"a+"))==NULL)
           {
     	       printf("%s文件打开失败!\n",MyFileName);
  	       exit(2);	
           }
    while(1)
    {
      //if(runmode == DEBUG_MODE)
       // printf("Msg:I want to fetch record\n");
        sendPacket.clearAll();   // add  by crt & mmx 
        DBStatus=clientDB.fetchRecord();
     if(DBStatus==DBNORMAL) 
      {      	
        if(runmode == DEBUG_MODE)
          printf("Msg:Fetch record :ok\n");

        clientCfg.id=current_sid;   // add by crt
        sendpacketid++;
        
        memcpy(_tmp_BusinessID,clientDB.cBusinessID,strlen(clientDB.cBusinessID)+1); // Save clientDB.cBusinessID //add by mmx &crt
      
       // printf("111 clientDB.cBusinessID is %s,_tmp_BusinessID is %s\n",clientDB.cBusinessID,_tmp_BusinessID);

      	clientDB.setPacketData(sendPacket);      
      	nSubCode=clientDB.getOperateType();      	
      	if (nSubCode>=100 && nSubCode<130)
			sendPacket.setCode(SAMDEPOSITREQ);
		else if (nSubCode>=130 && nSubCode<140)
			sendPacket.setCode(SAMCDRREQ);
		else
			sendPacket.setCode(nCode); //OBSREQ

      	sendPacket.setVersion(NEWVERSION);
      	sendPacket.setID(sendpacketid);    
      	sendPacket.setAuth(current_sid,current_sid,
      	                   clientCfg.repeat,nSubCode);      	//add by crt & mmx  reset sender_id,recive_id
  	
   //   	sendPacket.setAuth(clientCfg.sender,clientCfg.recver,
  //    	                     clientCfg.repeat,nSubCode);      	
      	break;
      }	
	if(DBStatus==DBFAILURE)
	{
		p_nanosleep(RECONNDBWAIT * 1000000);
		if (runmode == DEBUG_MODE)
		   printf("sleep.......2\n");      
	}
        
      //p_nanosleep(DBSEARCHWAIT);
    }

⌨️ 快捷键说明

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