int kcc_drtp_recv_cpack(int handle,ST_CPACK * apack, ST_PACK * apackarray,int pa_len) { int ret = 0; char buf[8182] = ""; int rows; int rec_len = 0; // FIXME : get timeout from config file rec_len = kcc_drtp_receive(handle,buf,sizeof(buf),30000); if(rec_len < 0) { return -1; } // decode buffer ret = DecodeBufWithArray((unsigned char*)buf,rec_len,apack,apackarray+1,&rows, kcc_drtp_err_msg); if(!ret) { kcc_write_log(LOG_ERR,"decode buf error.",handle); return -1; } if( rows > pa_len ) { // FIXME : there are maybe some error. ; } rows = apack->head.recCount; ret = rows; kcc_memcpy(&apackarray[0],&apack->pack,sizeof(apackarray[0])); kcc_write_log(LOG_DEBUG,"receive drpt pack [%d] rows",rows); switch(kcc_drtp_valid_cpack(apack)) { case -1: ret = -1; kcc_write_log(LOG_INFO,"receive request type not exists![%d]", apack->head.RequestType); ret = -1; break; case 1: ret = -1; kcc_write_log(LOG_ERR,"receive request[%d] error return code[%d]", apack->head.RequestType,apack->head.retCode); ret = -1; break; } // print debuf info if( g_debug_level > 5 ) { ShowPack(apack,buf); /* for(i = 1;i < rows;++i) { printf("===========================>>>>row%03d",i+1); ShowPackNext(apack,&apackarray[i],buf); printf("%s\n",buf); } */ } return ret; }
int kcc_drtp_recv_next_cpack(int handle,int req_no, ST_CPACK *apack,ST_PACK * apackarray) { // there is no next buffer ST_CPACK rpack; long next_main_func; int ret = 0; char buf[4096] = ""; int rows; int rec_len = 0; if( apack->head.nextflag == 0 ) return 0; // send request again kcc_memclr(&rpack,sizeof(ST_CPACK)); rpack.head.firstflag = 0; rpack.head.nextflag = 1; rpack.head.RequestType = req_no; kcc_memcpy(&rpack.head.hook,&apack->head.hook,sizeof(rpack.head.hook)); rpack.head.hook.queuetype = apack->head.hook.queuetype; next_main_func = atol(apack->head.hook.hostname); kcc_drtp_set_main_func(next_main_func); ret = kcc_drtp_send_cpack(handle,&rpack); if( !ret ) return ret; // receive buffer rec_len = kcc_drtp_receive(handle,buf,sizeof(buf),100); if( rec_len < 0 ) { kcc_write_log(LOG_ERR,"get next pack error. handle[%d]",handle); return -1; } // decode buffer ret = DecodeBufWithArray((unsigned char*)buf,rec_len,apack,apackarray+1,&rows, kcc_drtp_err_msg); if(!ret) { kcc_write_log(LOG_ERR,"decode buf error.",handle); return -1; } kcc_memcpy(&apackarray[0],&(apack->pack),sizeof apack->pack); rows = apack->head.recCount; // print debuf info if( g_debug_level > 5 ) { ShowPack(apack,buf); //printf("row%03d",i+2); //ShowPackNext(apack,&apackarray[i],buf); //printf("====================================\n"); } return rows; }
int CSvrLink::IntCall(char *szBUGroupID, int waittime, ST_CPACK *rpack, ST_CPACK *apack, ST_PACK *pArrays) { int rtn; unsigned short len; unsigned char sbuf[MAXMSG]; char szmsg[256]={0}; RP_INTCALLH *pic = (RP_INTCALLH *)sbuf; pic->waittime = htonl(waittime); strncpy(pic->szBUGroupID,szBUGroupID,MAXBUGRPID); if (rpack->head.recCount>1) { rpack->head.recCount = 1; } EncodeBuf(rpack,sbuf+sizeof(RP_INTCALLH),&rtn,szmsg); len = rtn+sizeof(RP_INTCALLH); rtn=SendMsg(MT_INTCALL,len,sbuf); while (rtn==0) { rtn = RecvMsg(waittime*1000+1000); if (rtn>0) { MSGBUF *pmb = GetRecvMsg(); if (pmb->head.msgtype==MT_PUSHDATA) { // 有应答数据返回: rtn = 0; DecodeBufWithArray((unsigned char *)pmb->data,pmb->head.len,apack,pArrays,&rtn,szmsg); //memset(&xcdata,0,sizeof(xcdata)); // 清空 memcpy(&(xcdata.ahead),&(apack->head),sizeof(ST_PACKHEAD)); if (pmb->head.len>=rtn+sizeof(TPUSHDESTN)) { TPUSHDESTN *pd = (TPUSHDESTN *)(pmb->data+rtn); xcdata.sno = ntohs(pd->SourceNo); xcdata.dno = ntohs(pd->DestNo); xcdata.fno = ntohs(pd->FuncNo); } return(rtn); } else { DEBUG_RUNTIME_MSGOUT("IntCall中间收到了非MT_INTCALL应答包,属于程序错误!"); rtn = 0; // 继续读取数据,以便接收到正确的MT_INTCALL应答包 } } else if (rtn==0) { return(-2); // 等待应答数据超时,即自从向外发送了请求后,在waittime+1秒内没有接收到应答数据 } } return(-1); // 其他各种通讯方面的错误 }
int CSvrLink::ExtCall(int sourceno, int destno, int funcno, int batchno, int acktime, ST_CPACK *rpack, ST_CPACK *apack, ST_PACK *pArrays) { int rtn; char szmsg[256]; xcdata.sno = sourceno; xcdata.dno = destno; xcdata.fno = funcno; xcdata.bno = batchno; rpack->head.userdata = batchno; if (acktime<=0) { acktime = 5; // 缺省为5秒钟内得到应答,否则作为失败处理。。。以防止业务部分调用错误导致整个BUNIT处理失败或挂起 } rtn = PushData(sourceno,destno,funcno,batchno,rpack,PM_ANSWER,acktime); while (rtn==0) { rtn = RecvMsg(acktime*1000+1000); if (rtn>0) { MSGBUF *pmb = GetRecvMsg(); if (pmb->head.msgtype==MT_PUSHDATA) { // 有应答数据返回: rtn = 0; DecodeBufWithArray((unsigned char *)pmb->data,pmb->head.len,apack,pArrays,&rtn,szmsg); memcpy(&xcdata.ahead,&(apack->head),sizeof(ST_PACKHEAD)); if (apack->head.hook.queuetype>0) xcdata.fno = apack->head.hook.queuetype; else if (atoi(apack->head.hook.hostname)>0) xcdata.fno = atoi(apack->head.hook.hostname); return(rtn); } else { DEBUG_RUNTIME_MSGOUT("ExtCall中间收到了非MT_PUSHDATA应答包,属于程序错误!"); rtn = 0; // 继续读取数据,以便接收到正确的MT_PUSHDATA应答包 } } else if (rtn==0) { return(-2); // 等待应答数据超时,即自从向外发送了请求后,在acktime+1秒内没有接收到应答数据 } } return(-1); // 其他各种通讯方面的错误 }
int CDRTPHelper::SendRequest(int timeout /*=0*/) { m_errcode = 0; memset(&m_errmsg,0,sizeof m_errmsg); int len = sizeof m_drtpBuf; int retries = 3; BOOL bRet = FALSE; m_currRecord = NULL; m_currIndex = 0; m_currRecordCount = 0; m_timeout = timeout; m_requestPack.head.recCount = m_rec_cnt; m_requestPack.head.retCode = 0; memset(m_drtpBuf,0,sizeof m_drtpBuf); if(!EncodeBuf(&m_requestPack, m_drtpBuf,&len, m_errmsg)) return -3; /* bRet = DrtpSendMessage((char*)m_drtpBuf,len,&m_errcode,m_errmsg,&m_tag, 0,-1,0,-1,2); */ bRet = DrtpPostMessage(5,m_drtpNo,m_funcNo,(char*)m_drtpBuf,len,&m_errcode,m_errmsg,m_drtpHandle,0,1); if(bRet == FALSE) { GetErrMsg(); testDrtpHandle(); return -1; } retries = 3; int readLen = 0; bRet = DrtpReadMessage((char*)m_drtpBuf, sizeof m_drtpBuf,&readLen, m_drtpHandle,&m_tag,&m_errcode,m_errmsg,m_timeout); if(bRet == FALSE) { GetErrMsg(); logDrtpErrMsg(); testDrtpHandle(); return -1; } memset(&m_responsePack,0,sizeof(m_responsePack)); memset(m_dataArray, 0, sizeof(m_dataArray)); // 把接收缓冲区中的内容解码到Pack和DataArray中 len = sizeof m_drtpBuf; int nCount = 0; bRet = DecodeBufWithArray((BYTE*)m_drtpBuf,readLen, &m_responsePack ,m_dataArray, &nCount, 0); if(bRet == FALSE) { GetErrMsg(); logDrtpErrMsg(); return -1; } // 记录返回结果集数 m_currRecordCount = m_responsePack.head.recCount; return 0; }
//---------------------------------------------------------------------------- // // Function: ReadSmartTaskPlan // // Synopsis: 得到金仕达主动发出的任务 // // Arguments: pTaskPlan -- 任务计划内容 // // History: 2004-09-20 ZhangWei Created // // Notes: // //---------------------------------------------------------------------------- long __stdcall ReadSmartTaskPlan(TSSmartTaskPlan *pTaskPlan) { AFX_MANAGE_STATE(AfxGetStaticModuleState()); //10分钟发一次设备心跳监控任务 add by dengjun date 20051116 static int flag =0; static DWORD StartTime=GetTickCount(); static DWORD StartTimeStatus=GetTickCount(); static DWORD TIMESENDTICK=0; static DWORD TIMESENDSTATUS=0; bool bResult = false; char buffer[10240]; int nLen = sizeof(buffer); char omsg[256]; bool bEnd = false ; ST_CPACK apack; ST_PACK apackarray[60]; int nRow = 0 ; int nlen = 0 ; WriteLog(".....................ReadSmartTaskPlan..................................."); DWORD endTime =GetTickCount()-StartTime; DWORD endTimeStuats=GetTickCount()-StartTimeStatus; //第一次运行时,需要从配置文件中获取心跳时间间隔 if( !flag ) { char szDir[MAX_PATH]; char strServerINI[MAX_PATH]; memset(szDir,0x00,sizeof szDir); memset(&apack, 0x00,sizeof(apack)); memset(strServerINI,0x00,sizeof strServerINI); flag = 1; GetCurPath(szDir); sprintf(strServerINI, "%s\\SmartServer.ini", szDir); //取黑名单版本及时钟(默认10分钟) TIMESENDTICK = GetPrivateProfileInt("SYSTEM", "TICKTIME", 600, strServerINI); TIMESENDTICK = 1000*TIMESENDTICK; //终端状态时间(默认为10秒) TIMESENDSTATUS = GetPrivateProfileInt("SYSTEM", "STATUSTIME", 10, strServerINI); TIMESENDSTATUS = 1000*TIMESENDSTATUS; //WriteLog("ReadSmartTaskPlan()心跳时间[%ld毫秒],发送终端状态时间[%ld毫秒],[%s]\n",TIMESENDTICK,TIMESENDSTATUS,strServerINI); } printf("------------向金仕达获取任务-------------[时间差=%ld::等待时间=%ld]\n",endTime,TIMESENDTICK); ZeroMemory(pTaskPlan, sizeof(TSSmartTaskPlan)); pTaskPlan->nRepeatTime = 1 ; //持续多长时间(分钟) pTaskPlan->nRepeatTimes = 1; //重复次数 memset(omsg, 0x00, sizeof omsg ); memset(buffer,0x00, sizeof buffer); memset(&apack,0x00,sizeof apack ); memset(apackarray,0x00,sizeof apackarray); while( !bEnd ) { nLen = sizeof(buffer); memset(buffer, 0, sizeof(buffer)); nlen = RecvDataPro(buffer, nLen,10000); if( nlen <= 0 ) { return RET_SYSERROR; } nRow = 0 ; memset(&apack, 0, sizeof(apack)); memset(apackarray, 0, sizeof(apackarray)); BOOL bRet=DecodeBufWithArray((unsigned char*)buffer,nlen,&apack,apackarray,&nRow,omsg); if(bRet == FALSE) { WriteLog("应答数据包报文错误Ret=%d\n", bRet); printf("应答数据包报文错误Ret=%d\n", bRet); return RET_SYSERROR; } if(apack.head.retCode) { WriteLog("金仕达后台业务处理失败,返回码retcode=%d,返回信息[%s]\n",apack.head.retCode,apack.pack.vsmess); printf("金仕达后台业务处理失败,返回码retcode=%d,返回信息[%s]\n",apack.head.retCode,apack.pack.vsmess); return RET_SYSERROR;//XXX为相应的错误码,也可以直接 return 0; } if(apack.pack.lvol1<=0) { WriteLog("金仕达没有任务下达!!!\n"); //当没有任务且已经到了发送心跳的时间则发送心跳 // add by dengjun 20051117 心跳任务 if( endTime >= TIMESENDTICK ) { //WriteLog("由于已经到发送心跳包时间,且金仕达没有任务,开始发送终端心跳包............\n"); memset(&apack, 0x00, sizeof apack ); memset(&pTaskPlan, 0x00, sizeof pTaskPlan); StartTime = GetTickCount(); apack.pack.lvol2 = 930057; apack.pack.lvol1 = GetTickCount(); apack.head.RequestType = 930057; nRow=1; pTaskPlan->nTask = 0; //2005-12-20 modified by wenjian bResult=theApp.MakeFirstTaskPlan(pTaskPlan, &apack, apackarray, nRow); return (bResult?RET_OK:RET_SYSERROR); } // add by dengjun 20060111 取设备状态 if( endTimeStuats >= TIMESENDSTATUS) { //WriteLog("由于已经到发送取终端状态时间,且金仕达没有任务,开始发送终端数据包............\n"); memset(&apack, 0x00, sizeof apack ); memset(&pTaskPlan, 0x00, sizeof pTaskPlan); StartTimeStatus = GetTickCount(); apack.pack.lvol2 = 930058; apack.pack.lvol1 = GetTickCount(); apack.head.RequestType = 930058; nRow=1; pTaskPlan->nTask = 0; bResult=theApp.MakeFirstTaskPlan(pTaskPlan, &apack, apackarray, nRow); return (bResult?RET_OK:RET_SYSERROR); } return RET_NOTASK; //金仕达没有任务下达 } if( apack.head.firstflag == 1 ) { bResult = theApp.MakeFirstTaskPlan(pTaskPlan, &apack, apackarray, nRow); } else { bResult = theApp.MakeNextTaskPlan(pTaskPlan, &apack, apackarray, nRow); } if( !apack.head.nextflag ) bEnd = true ; } //取终端设备状态 if( endTimeStuats >= TIMESENDSTATUS) { //WriteLog("由于已经到发送取终端状态时间,且金仕达没有任务,开始发送终端数据包............\n"); memset(&apack, 0x00, sizeof apack ); StartTimeStatus = GetTickCount(); apack.pack.lvol2 = 930058; apack.pack.lvol1 = GetTickCount(); apack.head.RequestType = 930058; nRow=1; bResult=theApp.MakeFirstTaskPlan(pTaskPlan, &apack, apackarray, nRow); } // add by dengjun 20051117 心跳任务 if( endTime >= TIMESENDTICK ) { //WriteLog("由于已经到发送心跳包时间,收到金仕达任务,开始发送终端心跳包,与心跳任务一起处理............\n"); memset(&apack, 0x00,sizeof(apack)); StartTime = GetTickCount(); apack.pack.lvol2 = 930057; apack.pack.lvol1 = GetTickCount(); apack.head.RequestType = 930057; nRow=1; bResult = theApp.MakeFirstTaskPlan(pTaskPlan, &apack, apackarray, nRow); } return (bResult?RET_OK:RET_SYSERROR); }
//---------------------------------------------------------------------------- // // Function: ReadSmartDocList // // Synopsis: 读入设备档案表 // // Arguments: pSmartDoc -- 设备档案表 // nRecCount -- 记录数 // // History: 2004-09-20 ZhangWei Created // // Notes: // //---------------------------------------------------------------------------- long __stdcall ReadSmartDocList(TSSmartDoc *pSmartDoc, long *nRecCount) { AFX_MANAGE_STATE(AfxGetStaticModuleState()); ST_CPACK rpack; ST_CPACK apack; ST_PACK apackarray[60]; char buffer[20960]; WriteLog("三九前置向金仕达调用功能号%d, 申请获取全部设备档案表\n", 930037); long k = 0 ; bool bEnd = false; int nlen = 0 ; int nRow = 0 ; int nfirst = 1 ; int nLen = sizeof(buffer); char omsg[256]; ST_PACK *pPacket = NULL; HANDLE& hHandle = ConnectPool.Alloc(); #if __DEBUG_INTERFACE__ //#if 0 while( !bEnd ) { if( k >= MAX_SMART_DOC ) { ConnectPool.Free(hHandle); WriteLog("设备档案数量大于%d, 请检查设备档案参数表!!!!\n", MAX_SMART_DOC); break; } memset(&rpack, 0, sizeof(rpack)); rpack.head.RequestType = 930037; rpack.head.recCount = 1; /* 本包的记录数*/ rpack.head.retCode = 0; /* 返回代码*/ rpack.head.userdata = 0; if( nfirst ) { rpack.head.firstflag = 1; /* 是否第一个请求(首包请求)*/ rpack.head.nextflag = 0; /* 是否后续包请求*/ nfirst = 0 ; } else { rpack.head.firstflag = 0; /* 是否第一个请求(首包请求)*/ rpack.head.nextflag = 1; /* 是否后续包请求*/ memcpy(&rpack.head.hook,&apack.head.hook,sizeof(rpack.head.hook)); rpack.head.hook.queuetype=apack.head.hook.queuetype; } SetValue(&rpack.head,&rpack.pack, F_SDATE1, "00000000"); SetValue(&rpack.head,&rpack.pack, F_LCERT_CODE, GetValue(iSmartKey)); //前置机注册号 SetValue(&rpack.head,&rpack.pack, F_SCUST_LIMIT2, sSmartKey); //动态密钥 nLen = sizeof(buffer); memset(buffer, 0, sizeof(buffer)); if( !EncodeBuf(&rpack, (unsigned char*)buffer, &nLen, omsg) ) { ConnectPool.Free(hHandle); WriteLog("执行功能号930037读入设备档案表时,运行EncodeBuf失败\n"); return RET_SYSERROR; } printf("执行功能号930037读入设备档案表\n"); if( SendData(hHandle, iServerNo, iFunc, (char*)buffer, nLen, 1, FALSE) != RET_OK ) { ConnectPool.Free(hHandle); WriteLog("执行功能号930037读入设备档案表时,运行SendData失败\n"); return RET_SYSERROR; } memset(buffer, 0, sizeof(buffer)); nLen = sizeof(buffer); nlen = RecvData(hHandle, buffer, nLen, 10000); if( nlen <= 0 ) { ConnectPool.Free(hHandle); WriteLog("执行功能号930037读入设备档案表时,运行RecvData失败\n"); return RET_SYSERROR; } BOOL bRet=DecodeBufWithArray((unsigned char*)buffer,nlen,&apack,apackarray,&nRow,omsg); if( !bRet || apack.head.retCode ) { ConnectPool.Free(hHandle); WriteLog("执行功能号930037读入设备档案表时,运行DecodeBufWithArray,返回无数据,失败!\n"); return RET_SYSERROR; } WriteLog("执行功能号930037读入设备档案表时,得到设备数量为:%d,设备参数为:\n",nRow); for(int i=0; i< nRow; i++) { if( i == 0 ) pPacket = &apack.pack; else pPacket = &apackarray[i-1]; strcpy(pSmartDoc[k].m_szMacCode, pPacket->semp); //终端机型号代码 strcpy(pSmartDoc[k].m_szMacCard, pPacket->sholder_type);//可用IC卡卡型 strcpy(pSmartDoc[k].m_szMacModle, pPacket->semp); //终端机型号 strcpy(pSmartDoc[k].m_szMacType, pPacket->semp); //机型名称 strcpy(pSmartDoc[k].m_szDeviceID, pPacket->sdate1); //设备ID strcpy(pSmartDoc[k].m_szRegister, pPacket->sdate2); //注册号 pSmartDoc[k].m_nAuthID=ConvertID(pSmartDoc[k].m_szDeviceID);//授权号 pSmartDoc[k].m_nMachineNo=pPacket->lvol4; //机号 strcpy(pSmartDoc[k].m_szVersion, pPacket->sdate3); //设备版本号 strcpy(pSmartDoc[k].m_szPassword, "000000"); //系统员密码 strcpy(pSmartDoc[k].m_szOprPasswd, "000000"); //管理员密码 pSmartDoc[k].m_nPwdswitch=-1; //密码开关 strcpy(pSmartDoc[k].m_sClockVer, pPacket->stime0); //父设备 strcpy(pSmartDoc[k].m_szOrgid, "001"); //所属的组织代码 pSmartDoc[k].m_nPortCount=pPacket->lvol5; //服务器端口总数 pSmartDoc[k].m_nSMTPort=pPacket->lvol6; //服务器端口号 strcpy(pSmartDoc[k].m_szPort, pPacket->sbank_code); //通讯端口 pSmartDoc[k].m_nBaudRate=pPacket->lvol9; //波特率 pSmartDoc[k].m_nCommMode=pPacket->lvol8; //链路模式 strcpy(pSmartDoc[k].m_szAddr, pPacket->sstation0); //通讯地址 pSmartDoc[k].m_nStatus=pPacket->lvol7; //设备状态, 下面定义为: pSmartDoc[k].m_nConnType = pPacket->lvol10; //通讯方式 strcpy(pSmartDoc[k].m_szClass, pPacket->snote2); //卡类 // pSmartDoc[k].m_wFlowNo=pPacket->lvol11+1; //期望流水号 modified pSmartDoc[k].m_wLastInvoiceNo=pPacket->lvol11; //终端交易流水号期末值 pSmartDoc[k].m_wStateNo=pPacket->lvol12; pSmartDoc[k].m_nFlow=1; //序号 pSmartDoc[k].m_nBeginInvoice=0; //扎帐的开始流水 pSmartDoc[k].m_wSettleinvoice=0; //扎帐流水号期末值 pSmartDoc[k].m_wEndInvoice=0; //扎帐的结束流水号 strcpy(pSmartDoc[k].m_sBlackExpire, pPacket->sserial0); //黑名单的有效期 strcpy(pSmartDoc[k].m_sDownBlackTime, pPacket->sserial1); //黑名单下传时间期末值 pSmartDoc[k].m_nStartuse=0; //签到结果 pSmartDoc[k].m_nCardID = 12; pSmartDoc[k].m_nDealCount = 10; pSmartDoc[k].m_nInMoney = 100000; pSmartDoc[k].m_nOutMoney = pSmartDoc[k].m_nInMoney; pSmartDoc[k].m_nBeginInvoice = 0 ; pSmartDoc[k].m_wFlowNo = 0 ; pSmartDoc[k].m_wStateNo = 0 ; WriteLog("终端机型号代码=%s,可用IC卡卡型=%s, 终端机型号=%s, 机型名称=%s\n " "设备ID=%s, 注册号=%s, 机号=%d, 设备版本号=%s, 系统员密码=%s, 管理员密码=%s\n" "密码开关=%d, 服务器端口总数=%d, 服务器端口号=%d, 通讯端口=%s, 波特率=%d\n" "链路模式=%d,通讯地址=%s, 设备状态=%d, 交易流水号期末值=%d, 黑名单的有效期=%s, 黑名单版本=%s, 通讯方式=%d,卡类=%s, 父设备:%s\n", pPacket->semp, pPacket->sholder_type, pPacket->semp, pPacket->semp, pPacket->sdate1, pPacket->sdate2, pPacket->lvol4, pPacket->sdate3, "000000", "000000", pSmartDoc[k].m_nPwdswitch, pPacket->lvol5, pPacket->lvol6, pPacket->sbank_code, pPacket->lvol9, pPacket->lvol8, pPacket->sstation0, pPacket->lvol7, pPacket->lvol11, pPacket->sserial0, pPacket->sserial1, pPacket->lvol10, pPacket->snote2, pPacket->stime0); if( !theApp.CheckSmartDocValid(&pSmartDoc[k]) ) { WriteLog("无效设备!!!\n"); ZeroMemory(&pSmartDoc[k], sizeof(TSSmartDoc)); } else { WriteLog("有效设备!ID号=%s, 注册号=%s, 机号=%d, 网络类型:%d..父设备代码=%s\n", pSmartDoc[k].m_szDeviceID, pSmartDoc[k].m_szRegister, pSmartDoc[k].m_nMachineNo, pSmartDoc[k].m_nCommMode, pSmartDoc[k].m_sClockVer); k++; } } if( apack.head.nextflag == 0 ) bEnd = true ; } #else k = 0 ; /***********************************************************************************************************************************************************/ // 以下为加入调试信息 /***********************************************************************************************************************************************************/ int iTick = 0 ; char sTempNo[32]; char sIP[32]; char szParent[32] = "" ; int iMacNo = 1; int nPort = 10001; strcpy(sIP, "10.83.28.40"); for(int j=k; j<2; j++) { sprintf(sTempNo, "0000%04d", j+100); //模拟LPort if( iTick == 0 || iTick == 15 ) { strcpy(pSmartDoc[k].m_szMacCode, "5301"); //终端机型号代码 strcpy(pSmartDoc[k].m_szMacModle, "5301"); //终端机型号 strcpy(pSmartDoc[k].m_szMacType, "5301"); //机型名称 strcpy(pSmartDoc[k].m_szDeviceID, "0000918F"); //设备ID strcpy(pSmartDoc[k].m_szRegister, "0000918F"); //注册号 pSmartDoc[k].m_nAuthID=ConvertID(pSmartDoc[k].m_szDeviceID);//授权号 pSmartDoc[k].m_nMachineNo=1; //机号 strcpy(pSmartDoc[k].m_szAddr, sIP); //通讯地址 pSmartDoc[k].m_nPortCount=16; //服务器端口总数 sprintf(pSmartDoc[k].m_szPort, "%d", nPort); //nPort++); //通讯端口 strcpy(pSmartDoc[k].m_sClockVer, ""); //父设备 iMacNo=1; strcpy(szParent, pSmartDoc[k].m_szDeviceID); pSmartDoc[k].m_nSMTPort=0; //服务器端口号 } else { //if( iTick == 0 || iTick == 6 || iTick == 8 || iTick == 10 ) //{ strcpy(pSmartDoc[k].m_szMacCode, "0226"); //终端机型号代码 strcpy(pSmartDoc[k].m_szMacCard, "64");//可用IC卡卡型 strcpy(pSmartDoc[k].m_szMacModle, "0226"); //终端机型号 strcpy(pSmartDoc[k].m_szMacType, "0226"); //机型名称 //} /*else { strcpy(pSmartDoc[k].m_szMacCode, "0201"); //终端机型号代码 strcpy(pSmartDoc[k].m_szMacCard, "64");//可用IC卡卡型 strcpy(pSmartDoc[k].m_szMacModle, "0201"); //终端机型号 strcpy(pSmartDoc[k].m_szMacType, "0201"); //机型名称 }*/ strcpy(pSmartDoc[k].m_szDeviceID, "00008B1a"); //设备ID strcpy(pSmartDoc[k].m_szRegister, "00008B1a"); //注册号 pSmartDoc[k].m_nAuthID=0x00008B1a;//ConvertID(pSmartDoc[k].m_szDeviceID);//授权号 pSmartDoc[k].m_nMachineNo=1;//++iMacNo; //机号 pSmartDoc[k].m_nPortCount=16; //服务器端口总数 strcpy(pSmartDoc[k].m_szAddr, sIP); //通讯地址 strcpy(pSmartDoc[k].m_sClockVer, szParent); //父设备 pSmartDoc[k].m_nSMTPort=2; //iMacNo; //服务器端口号 } if( iTick >= 15 ) iTick = 0 ; else iTick++; strcpy(pSmartDoc[k].m_szMacCard, "64");//可用IC卡卡型 strcpy(pSmartDoc[k].m_szVersion, ""); //设备版本号 strcpy(pSmartDoc[k].m_szPassword, "000000"); //系统员密码 strcpy(pSmartDoc[k].m_szOprPasswd, "000000"); //管理员密码 pSmartDoc[k].m_nPwdswitch=-1; //密码开关 strcpy(pSmartDoc[k].m_szOrgid, "001"); //所属的组织代码 pSmartDoc[k].m_nBaudRate=19200; //波特率 pSmartDoc[k].m_nCommMode=3; //链路模式 pSmartDoc[k].m_nStatus=0; //设备状态, 下面定义为: pSmartDoc[k].m_nConnType = 1; //通讯方式 strcpy(pSmartDoc[k].m_szClass, "FFFFFFFFFF"); //卡类 // pSmartDoc[k].m_wFlowNo=0; //期望流水号 modified pSmartDoc[k].m_wLastInvoiceNo=0; //终端交易流水号期末值 pSmartDoc[k].m_wStateNo=0; pSmartDoc[k].m_nFlow=1; //序号 pSmartDoc[k].m_nBeginInvoice=0; //扎帐的开始流水 pSmartDoc[k].m_wSettleinvoice=0; //扎帐流水号期末值 pSmartDoc[k].m_wEndInvoice=0; //扎帐的结束流水号 strcpy(pSmartDoc[k].m_sBlackExpire, "991231010101"); //黑名单的有效期 strcpy(pSmartDoc[k].m_sDownBlackTime, "991231010101"); //黑名单下传时间期末值 pSmartDoc[k].m_nStartuse=0; //签到结果 printf("有设备(ID=%s, 注册号:%s, 机号=%d, 网络类型:%d..父设备:%s...\n", pSmartDoc[k].m_szDeviceID, pSmartDoc[k].m_szRegister, pSmartDoc[k].m_nMachineNo, pSmartDoc[k].m_nCommMode, pSmartDoc[k].m_sClockVer); k++; } #endif gnDocCount = k; gpSmartDoc = new TSSmartDoc[gnDocCount]; if( gpSmartDoc == NULL ) { printf("内存不足.....\n"); gnDocCount = 0 ; ConnectPool.Free(hHandle); return RET_SYSERROR; } long iCount = 0 ; memcpy(gpSmartDoc,pSmartDoc,sizeof(TSSmartDoc)*k); memset(pSmartDoc, 0, sizeof(TSSmartDoc)*k); for(int i=0; i< k; i++) { if( theApp.CheckSmartDocValid(gpSmartDoc, k, i) ) { memcpy(&pSmartDoc[iCount++], &gpSmartDoc[i], sizeof(TSSmartDoc)); } } memset(gpSmartDoc, 0, sizeof(TSSmartDoc)*k); gnDocCount = 0 ; k = iCount; ConnectPool.Free(hHandle); WriteLog("有效设备总数量:%d...........\n", k); *nRecCount = k; long nKCount = 0 ; for(i=0; i<k; i++) { if( strcmp(pSmartDoc[i].m_sClockVer, "") ) { for(int j=0; j<k; j++) { if( !strcmp(pSmartDoc[j].m_szDeviceID, pSmartDoc[i].m_sClockVer) && i != j ) { pSmartDoc[i].m_nParentID = pSmartDoc[j].m_nAuthID ; pSmartDoc[i].m_nLevel = 1; pSmartDoc[i].m_szLevelArray[0] = (char)pSmartDoc[j].m_nMachineNo; pSmartDoc[i].m_szLevelArray[1] = (char)pSmartDoc[i].m_nSMTPort; printf("父设备%s\n",pSmartDoc[j].m_szDeviceID); printf("------pSmartDoc[i].m_szDeviceID = %s \n",pSmartDoc[i].m_szDeviceID); printf("------pSmartDoc[i].m_szLevelArray=%d\n",pSmartDoc[j].m_nMachineNo); printf("------pSmartDoc[i].m_szLevelArray=%d\n",pSmartDoc[i].m_nSMTPort); break; } } } else { pSmartDoc[i].m_nLevel=0; } } gnDocCount = k; memcpy(gpSmartDoc,pSmartDoc,sizeof(TSSmartDoc)*k); return RET_OK; }
int CDRTPHelper::SendRequest(int timeout /*=0*/) { m_errcode = 0; memset(&m_errmsg,0,sizeof m_errmsg); int len = sizeof m_drtpBuf; int retries = 3; BOOL bRet = FALSE; m_currRecord = NULL; m_currIndex = 0; m_currRecordCount = 0; m_timeout = timeout; m_requestPack.head.recCount = m_rec_cnt; TAG_DRTPHANDLE tag; memset(&tag,0,sizeof(tag)); memset(m_drtpBuf,0,sizeof m_drtpBuf); if(!DrtpAttachServer(m_drtpNo,m_funcNo,m_drtpHandle,&tag,&m_errcode,m_errmsg)) { try { testDrtpHandle(); return -1; } catch (DrtpConnectException&) { return -2; } } EncodeBuf(&m_requestPack, m_drtpBuf,&len, NULL); bRet = DrtpSendMessage((char*)m_drtpBuf,len,&m_errcode,m_errmsg,&tag, 0,-1,0,-1,2); if(bRet == FALSE) { GetErrMsg(); testDrtpHandle(); return -1; } retries = 3; int readLen = 0; bRet = DrtpReadMessage((char*)m_drtpBuf, sizeof m_drtpBuf,&readLen, m_drtpHandle,&tag,&m_errcode,m_errmsg,m_timeout); if(bRet == FALSE) { GetErrMsg(); logDrtpErrMsg(); return -1; } memset(&m_responsePack,0,sizeof(m_responsePack)); memset(m_dataArray, 0, sizeof(m_dataArray)); // 把接收缓冲区中的内容解码到Pack和DataArray中 len = sizeof m_drtpBuf; int nCount = 0; bRet = DecodeBufWithArray((BYTE*)m_drtpBuf,readLen, &m_responsePack ,m_dataArray, &nCount, 0); if(bRet == FALSE) { GetErrMsg(); logDrtpErrMsg(); return -1; } // 记录返回结果集数 m_currRecordCount = m_responsePack.head.recCount; return 0; }
int CSvrLink::CallBPFunction(MSGBUF *pmb) { AP_REQUEST *preq; ST_CPACK rpack={0}; /* ****** Updated by CHENYH at 2006-3-23 0:37:37 ****** 为了能够为具体业务处理模块留出足够的堆栈空间,因此这里采用动态分配空间方式分配 ST_PACK pArrays[MAXROW]={0}; // 819200 / 在VC下缺省的stack空间本来也就1M (1048576) *******************************************************/ ST_PACK *pArrays; int recs; int rtn; char szMsg[256]; char *rdata = pmb->data+sizeof(AP_REQUEST); int rdlen = pmb->head.len-sizeof(AP_REQUEST); preq = (AP_REQUEST *)(pmb->data); ruserid.SourceNo = ntohs(preq->SourceNo); memcpy(&(ruserid.syshead),&(preq->syshead),sizeof(ruserid.syshead)); if (pProcess!=NULL) { if (DecodeHead((unsigned char *)rdata,rdlen,&head,szMsg)==sizeof(ST_PACKHEAD)) { memcpy(&reqhead,&head,sizeof(ST_PACKHEAD)); iLastReqType = head.RequestType; iAnswerMode = iDefaultAnswerMode; eMsg[0]='\0'; iLastRetCode = 0; rtn = (*pProcess)(&ruserid,rdata,rdlen,&iLastRetCode,eMsg); DataDone(iLastRetCode,eMsg); return(rtn); } } // 2006-3-23 0:56:40 采用动态分配,以少占用堆栈空间 pArrays = (ST_PACK *)malloc(((CXPack *)GetDefaultXPack())->GetPackLength()*MAXROW); if (DecodeBufWithArray((unsigned char *)rdata,rdlen,&rpack,pArrays,&recs,szMsg)>0) { int fno; ASSERT(rpack.head.firstflag==1); // 只有首包提交下来的。。。。 memcpy(&reqhead,&(rpack.head),sizeof(ST_PACKHEAD)); // 将请求包头记录下来 2005-9-21 17:35:06 memcpy(&head,&(rpack.head),sizeof(head)); memset(head.ParmBits,0,sizeof(head.ParmBits)); // 将结果集位图清空 head.recCount = 0; // Reset the recCount iLastReqType = rpack.head.RequestType; iAnswerMode = iDefaultAnswerMode; eMsg[0]='\0'; iLastRetCode = 0; fno = FindBPFunction(rpack.head.RequestType); if (fno>=0 && g_BDefines[fno].pFunc!=NULL) { unsigned int t1=GetTickCount(); // OK,have found the process function: #ifdef TESTINFO sprintf(szMsg,"Begin to call REQ%u <%s>!", rpack.head.RequestType, g_BDefines[fno].szRTName); DEBUG_RUNTIME_MSGOUT(szMsg); #endif rtn = (*pCallBDFunc)(fno,&ruserid,&rpack,pArrays,&iLastRetCode,eMsg); // 如果需要统计功能处理能力,在这里加上。。。 t1 = tc2_tc1(GetTickCount(),t1); DataDone(iLastRetCode,eMsg); if (iLastRetCode==0) { g_BDefines[fno].nSuccess++; g_BDefines[fno].dTakentime += t1; if (g_BDefines[fno].nSuccess==1) { g_BDefines[fno].nTt_max = g_BDefines[fno].nTt_min = t1; } else { if (g_BDefines[fno].nTt_max<t1) g_BDefines[fno].nTt_max=t1; if (g_BDefines[fno].nTt_min>t1) g_BDefines[fno].nTt_min = t1; } } else g_BDefines[fno].nFail++; //return(rtn); } else { iLastReqType = 0; iLastRetCode = 0; sprintf(szMsg,"BCC提交的请求<%u>在本业务单元中没有对应的处理定义!", rpack.head.RequestType); DEBUG_RUNTIME_MSGOUT(szMsg); rtn = -2; } } else { DEBUG_RUNTIME_MSGOUT(szMsg); rtn = -1; } free(pArrays); return(rtn); }
int CSvrLink::CallBPFunction(MSGBUF *pmb) { AP_REQUEST *preq; ST_CPACK rpack; // 20040409: QBIN希望能够处理多记录的请求 ST_PACK pArrays[MAXROW]; int recs; char szMsg[256]; preq = (AP_REQUEST *)(pmb->data); ruserid.SourceNo = ntohs(preq->SourceNo); memcpy(&(ruserid.syshead),&(preq->syshead),sizeof(ruserid.syshead)); //memcpy(&head,pmb->data+sizeof(AP_REQUEST),sizeof(head)); // 将原始请求的头截获下来,字序按照实际打包字序格式 // 这里留个底,也就不用转换字序了 if (DecodeBufWithArray((unsigned char *)(pmb->data+sizeof(AP_REQUEST)), pmb->head.len-sizeof(AP_REQUEST), &rpack,pArrays,&recs,szMsg)) { int fno; ASSERT(rpack.head.firstflag==1); // 只有首包提交下来的。。。。 fno = FindBPFunction(rpack.head.RequestType); if (fno>=0 && g_BDefines[fno].pFunc!=NULL) { int rtn; unsigned int t1=GetTickCount(); memcpy(&head,&(rpack.head),sizeof(head)); memset(head.ParmBits,0,sizeof(head.ParmBits)); // 将结果集位图清空 head.recCount = 0; // Reset the recCount iLastReqType = rpack.head.RequestType; iAnswerMode = iDefaultAnswerMode; // OK,have found the process function: #ifdef TESTINFO sprintf(szMsg,"Begin to call req%u <%s>!", rpack.head.RequestType, g_BDefines[fno].szRTName); DEBUG_RUNTIME_MSGOUT(szMsg); #endif eMsg[0]='\0'; iLastRetCode = 0; /* ****** Updated by CHENYH at 2004-2-21 12:23:30 ****** rtn = g_BDefines[fno].pFunc( &ruserid, &(rpack.pack), &retcode, szMsg ); */ rtn = CallBDFunc(fno,&ruserid,&rpack,pArrays,&iLastRetCode,eMsg); // 如果需要统计功能处理能力,在这里加上。。。 t1 = tc2_tc1(GetTickCount(),t1); DataDone(iLastRetCode,eMsg); if (iLastRetCode==0) { g_BDefines[fno].nSuccess++; g_BDefines[fno].dTakentime += t1; if (g_BDefines[fno].nSuccess==1) { g_BDefines[fno].nTt_max = g_BDefines[fno].nTt_min = t1; } else { if (g_BDefines[fno].nTt_max<t1) g_BDefines[fno].nTt_max=t1; if (g_BDefines[fno].nTt_min>t1) g_BDefines[fno].nTt_min = t1; } } else g_BDefines[fno].nFail++; return(rtn); } else { iLastReqType = 0; iLastRetCode = 0; sprintf(szMsg,"BCC提交的请求<%u>在本业务单元中没有对应的处理定义!", rpack.head.RequestType); DEBUG_RUNTIME_MSGOUT(szMsg); return(-2); } } else { DEBUG_RUNTIME_MSGOUT(szMsg); return(-1); } }