📄 isap_client.cpp
字号:
#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 + -