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

📄 isap_client.cpp

📁 unix环境下的多进程方式应用程序编程示例应用
💻 CPP
📖 第 1 页 / 共 2 页
字号:
    fprintf(myfp,"[run in main process to fork %d]\n",process_num); 
      
      while (process_num>=global_num){/*p_nanosleep(RECONNDBWAIT * 1000000);*/}
      if (process_num<global_num)
      {
 refork:
      child_pid=fork();     //add by mmx
      if (child_pid==0)     //add by mmx
      {                     //add by mmx
             //ConnectLabel:
//                     printf("[run into child process %d]\n",process_num); 
                   
             	while(clientTcp.connect() != 0)
             	{
             		if(runmode == DEBUG_MODE)
             		{
//             			printf("Msg:Can't connect OBS server.\n");
             			printf("Msg:Tring to connect OBS server.\n");
             		}
             		p_nanosleep((long)10 * 1e6);//wait for 10 second
             		if (runmode == DEBUG_MODE)
             		   printf("sleep.......3\n");
             	}
             	
             	if(runmode == DEBUG_MODE)
             	{
             		printf("Msg:Connected OBS server.\n");
             	}
                     sendPacket.setAuth(current_sid,current_sid,
                   	                     clientCfg.repeat,nSubCode);      	//add by crt & mmx  reset sender_id,recive_id
             
                     time(&sj);
                     mytime=localtime(&sj);
                     fprintf(myfp,"[%d-%d-%d %d:%d:%02d]\n",
                                   mytime->tm_year+1900,mytime->tm_mon+1,mytime->tm_mday,mytime->tm_hour,mytime->tm_min,mytime->tm_sec);
                     if( runmode == DEBUG_MODE)         
                     sendPacket.print();      
                     sendPacket.print((FILE *) myfp);  
                     sendPacket.serialize((u_char*) &packetBuf,PACKETLEN,nOcts);      	
                   	sendPacket.clearAll();           
 //                  	fprintf(myfp,"[111 run in main process to fork %d]\n",process_num); 
             
             	
                   clientTcp.send(packetBuf,nOcts,nsendOcts);
                   memset(packetBuf,0,PACKETLEN);
                   cRecvBuf=packetBuf;      
                   nrecvOcts=recvPacket.getPacketHeadSize();
                   nresult=-1;
                   recvPacket.clearAll();      
                   nrespstatus=NORESPONSE;
                   for(int i=0;i<MAXRESPONSEWAIT;i++)
                   {
                     if(clientTcp.recv(cRecvBuf,PACKETLEN,nrecvOcts)!=-1){
                        recvPacket.unserialize((u_char *) cRecvBuf,nrecvOcts);
                        if(runmode == DEBUG_MODE){
                          printf("PRINT RECEIVED PACKAGE...\n");	
                          recvPacket.print();     
                        }      
                        time(&sj);
                        mytime=localtime(&sj);
                        fprintf(myfp,"[%d-%d-%d %d:%d:%02d]\n",
                                      mytime->tm_year+1900,mytime->tm_mon+1,mytime->tm_mday,mytime->tm_hour,mytime->tm_min,mytime->tm_sec);
                        recvPacket.print((FILE *) myfp);
                        fprintf(myfp,"==============================================================================================\n\n");
                        recvPacket.getID(recvpacketid);
                        if(sendpacketid==recvpacketid)
                        {  
                           nrespstatus=HASRESPONSE;
                           break;
                        }
                     }
                     else
                      {/*p_nanosleep(CLIENTRECVWAIT * 1000000);*/
                       p_nanosleep(CLIENTRECVWAIT * 100000);
                       if (runmode == DEBUG_MODE)
                          printf("sleep.......1\n");
                      }
                   }
             
             // to disconnect
                 if(clientTcp.disconnect()==-1){
                   if(runmode == DEBUG_MODE)
                     printf("Msg:Close connection failure.\n");
                   //return 0 ;//????
                    }
                 else
                  if(runmode == DEBUG_MODE)
                    printf("Msg:Closed OBS server connection.\n"); 
             
             
               {    
              COBSClientDB clientDB;     
             
               clientDB.setDB(dbuser,dbpasswd,dbhost);
             while(1)
             {
               if(!clientDB.initDB())   //Connect to DB in child process //add by crt & mmx
               {  p_nanosleep(CLIENTRECVWAIT * 100000);
                 if(runmode == DEBUG_MODE)
                   printf("Msg:Can't connect DB.\n");
                // return 0;	
               }
               else
                 if(runmode == DEBUG_MODE)
                   {printf("Msg:reConnected Database.\n");
             	break;
                   }
             }
             memcpy(clientDB.cBusinessID,_tmp_BusinessID,strlen(_tmp_BusinessID)+1); //Restore  clientDB.cBusinessID //add by mmx &crt
             printf("clientDB.cBusinessID is %s,_tmp_BusinessID is %s\n",clientDB.cBusinessID,_tmp_BusinessID);
             
                   if(nrespstatus==HASRESPONSE)
                   {
                      getReponsetResult(recvPacket,nresult,nerrorcode,clientDB);
                      if(runmode == DEBUG_MODE)
                        printf("nresult=%d,nerrorcode=%d\n",nresult,nerrorcode);
                      if(nresult==0)
                         clientDB.setProcessedStatus(); 
                      else
                        clientDB.setFailureStatus(nerrorcode);
                   }
                   else if(nrespstatus==NORESPONSE)
                     clientDB.setTimeOutStatus();
                   
                 if(clientTcp.disconnect()==-1){
                   if(runmode == DEBUG_MODE)
                     printf("Msg:Close connection failure.\n");
                   //return 0 ;//????
                    }
                 else
                  if(runmode == DEBUG_MODE)
                    printf("Msg:Closed OBS server connection.\n"); 
             }
                
                 p_nanosleep(CLIENTRECVWAIT * 200000); //add by crt wait for disconnect 
                exit(0);    //add by mmx 
        }
     else if ( child_pid<0)
      {sleep(1);
       goto refork;}
     else
          { process_num++;          //add by mmx 
            current_sid++;              // add by crt
            if (current_sid>max_sid) current_sid=min_sid;
           }

   }           //add by mmx 
    fclose(myfp);
  }
  return 1;
}


int readCfgInfo(const char* cCfgFile,OBSCfgInfo &obsclient)
{
  FILE *pCfgFile=NULL;
  char *cSep=(char*)" =\t";
  char cBuf[1024];
  char *cName=NULL,*cValue=NULL;
  
  memset(obsclient.ipaddr,0,sizeof(obsclient.ipaddr));
  obsclient.port=0;
  obsclient.id=0;
  obsclient.sender=0;
  obsclient.recver=0;
  obsclient.repeat=0;
  obsclient.sendwait=0;
  obsclient.recvwait=0;
  
  if((pCfgFile=fopen(cCfgFile,"r"))==NULL)
    return 0;
 
  while(fgets(cBuf,1024,pCfgFile)!=NULL)	
  {    
    cName=strtok(cBuf,cSep);    
    cValue=strtok(NULL,cSep);    
    if(cName!=NULL && cValue!=NULL)
    {    
       if(strncmp(cBuf,SERVERIPADDR,strlen(SERVERIPADDR))==0)
          memcpy(obsclient.ipaddr,cValue,strlen(cValue)+1);
       else if(strncmp(cBuf,SERVERPORT,strlen(SERVERPORT))==0)	
          obsclient.port=atoi(cValue);
       else if(strncmp(cBuf,CLIENTID,strlen(CLIENTID))==0)
          obsclient.id=atoi(cValue);
       else if(strncmp(cBuf,SENDER,strlen(SENDER))==0)
          obsclient.sender=atoi(cValue);
       else if(strncmp(cBuf,RECVER,strlen(RECVER))==0)
          obsclient.recver=atoi(cValue);
       else if(strncmp(cBuf,REPEAT,strlen(REPEAT))==0)
          obsclient.repeat=atoi(cValue);
       else if(strncmp(cBuf,SENDWAIT,strlen(SENDWAIT))==0)
          obsclient.sendwait=atoi(cValue);
       else if(strncmp(cBuf,RECVWAIT,strlen(RECVWAIT))==0)
          obsclient.recvwait=atoi(cValue);  
      else if(strncmp(cBuf,GLOBAL_NUM,strlen(GLOBAL_NUM))==0)
          obsclient.global_num=atoi(cValue);
      else if(strncmp(cBuf,MIN_SID,strlen(MIN_SID))==0)
          obsclient.min_sid=atoi(cValue);
      else if(strncmp(cBuf,MAX_SID,strlen(MAX_SID))==0)
          obsclient.max_sid=atoi(cValue);   
    }	
  }
   
   if(obsclient.port==0 || strlen(obsclient.ipaddr)==0)
    return 0;
   
   return 1;
}

int readDHCS(const char* cFileName,char* cUser,
                   char* cPasswd,char* cHostString)
{
  return 1;	
}

#define ARRAYLEN 1024

int getReponsetResult(CSamPacket &response,long &result,long &errorCode,COBSClientDB &clientDB)
{
  CSamAttrList *pObsList=NULL;	
  CSamRtbDict *pObsDict=NULL;
  CSamAttr  *pObsAttr=NULL;
  u_long attrcode;
  int  format;
  int  len;
  u_char vp[ARRAYLEN];
  char code[4];
  char cValue[ARRAYLEN+1];
  long lValue;
  int setResult=0;
  u_char p[ARRAYLEN];
   
  response.getAttrList(pObsList);
  response.getDict(pObsDict);
  if(pObsList==NULL || pObsDict==NULL){
    printf("Msg:Can't get response result.\n");
    return 0;
  }
  pObsList->setDict(pObsDict);
  pObsAttr=pObsList->find(RESPONSERESULT);
  if(pObsAttr!=NULL){
    pObsAttr->getValue(len,(u_char*) &p);
    if(len!=0)
    {memcpy((long*) &result,p,sizeof(long));}
     else
      return 0;
  }
  pObsAttr=pObsList->find(ERRORCODE);
  if(pObsAttr!=NULL){
    pObsAttr->getValue(len,(u_char*) p);
    if(len!=0)
    {memcpy((long*) &errorCode,p,sizeof(long));}
    else
      return 0;
  }
  
  if(pObsList!=NULL)
  {
    pObsAttr=pObsList->pHead;
    while(pObsAttr!=NULL)
    {    	
    	attrcode=0;
    	if(!pObsAttr->get(attrcode,format,len,vp))
    	{    	  
    	  if(attrcode==RESPONSERESULT || attrcode==ERRORCODE) 
    	  {
    	  	if (pObsAttr->pNext!=NULL)    	  	
		  		pObsAttr=pObsAttr->pNext;    	  			    	  	
    	  	else
    	  	  	break;
    	  	continue;    	  	
    	  }
    	  memset(cValue,0,sizeof(cValue));
    	  lValue=0;
    	  sprintf(code,"%d",attrcode);
    	  //if (format==0) memcpy((char*) &cValue,vp,sizeof(cValue));
    	  if (format==0) memcpy((char*) &cValue,vp,len);
    	  else if(format==1) 
    	  {
    	  	memcpy((long*) &lValue,vp,sizeof(lValue));    	    
    	    sprintf(cValue,"%ld",lValue);
    	  }   	   

		  //if (attrcode==105 || attrcode=106 || attrcode=107)
    	  if (format==0 && strlen(cValue)==0)
		  {
		  	pObsAttr->getValue(len,(u_char*) &p);
		  	if(len!=0)
		    {
		    	memcpy((char *) &cValue,p,len);		    	
		    }		    
		  }		

    	  if(!(setResult=clientDB.setReponseResult((char*) &code,(char *) &cValue,format)))
    	    break;
    	}
    	if (pObsAttr->pNext!=NULL)    	  	
			pObsAttr=pObsAttr->pNext;    	  			    	  	
    	else
    	  	break;
    }
    if(setResult)
      clientDB.commitDB();
    else 
      clientDB.rollbackDB();    
    //pObsAttr->clearAll(); 
  };
  return 1;
}

void getStopSignal(int s)
{
  if(runmode == DEBUG_MODE)
    printf("Msg:OBS client exit.\n");
  deletePidFile((char* ) PIDFILE);

	if(g_childpid != -1)
	{
		printf("parent process receive signal, kill child...\n");
		::kill(g_childpid, SIGKILL);
	}
	else
	{
		printf("child process receive signal, exit.\n");
		exit(1);
	}
}

void backJob(int s)
{
  if(runmode == DEBUG_MODE)
    printf("Msg:OBS client stop job.\n");
  deletePidFile((char* ) PIDFILE);

	if(g_childpid != -1)
	{
		printf("parent process receive signal, kill child...\n");
		::kill(g_childpid, SIGKILL);
	}
	else
	{
		printf("child process receive signal, exit.\n");
		exit(-1);
	}
  //exit(-1);
}

void usage(const char* appName)
{
   printf("Usage: %s|-d|-b|-h\n",appName);
   printf("\t-d Dubug mode.\n");
   printf("\t-b Back ground mode.\n");
   printf("\t-h Usage help.\n");
}

int writePidFile(char* fileName,pid_t pid)
{
  FILE *pidfile=NULL;
  if((pidfile = fopen(fileName,"wr")) == 0)
  {
    if (runmode == DEBUG_MODE)
      printf("Msg:Can't create pid file.\n");
    return 0;
  }
  fprintf(pidfile,"%d",pid);
  fclose(pidfile); 
  return 1;
}

int deletePidFile(char* fileName)
{
  if(remove(fileName) != 0)
    if(runmode == DEBUG_MODE)
      return 0;
  return 1;
}

⌨️ 快捷键说明

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