Example #1
0
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;
}
Example #2
0
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;
}
Example #3
0
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); // 其他各种通讯方面的错误
}
Example #4
0
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); // 其他各种通讯方面的错误
}
Example #5
0
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;
}
Example #8
0
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;
}
Example #9
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);
}
Example #10
0
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);
   }
}