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

📄 tuxedo.cpp

📁 本源码为移动公司话费查询中间件TUXEDO使用的实例
💻 CPP
📖 第 1 页 / 共 5 页
字号:
/***************************************
* file name Tuxedo.h
* create date : 2002.12.01
*
*
****************************************/
#include <fml32.h>
#include <stdio.h>
#include "Tuxedo.h"
//#include "generalflds.h"
#include "general32.flds.h"
#include "blocksock.h"

extern TPINIT *tpinitbuf;

#define F_SEND  ((FLDID)41064)          /* number: 104   type: string */
//#define F_RECV  ((FLDID)41065)          /* number: 105   type: string */
#define F_RECV  ((FLDID32)167775414)    /* number: 3254  type: string */
//#define F_RECV_FLAG ((FLDID32)167775415)    /* number: 3255  type: string */

char CTuxedo::s_chSeparator[] = 
	{"------------------------------------------------"};


//CTuxedo::CTuxedo(CSHPPRequest *pShppRequest,char *pPhone,char *pMonth,char *pBusinessTitle,double *pfOutFeeCount,int *pnLineCount)
CTuxedo::CTuxedo(char *pPhone,char *pMonth,char *pBusinessTitle,double *pfOutFeeCount,int *pnLineCount)
{
	m_pPhone = NULL;
	m_pMonth = NULL;
//	m_pShppRequest = pShppRequest;
	m_pBusinessTitle = NULL;
	m_pShppRequest = NULL;
//	m_pfOutFeeCount = pfOutFeeCount;
//	m_pnLineCount = pnLineCount;
	startindex= 0;
	endindex = 0;
	m_bFlag1=FALSE;

	memset(msgbuf,'\0',256);

}

CTuxedo::~CTuxedo()
{
}

//与服务器连接
int CTuxedo::Td_Init(char *wsaddrlist)
{

	int  nNum =   20;
	char tempbuf[50];
	sprintf(tempbuf,"WSNADDR=%s",wsaddrlist);
	nNum=tuxputenv(tempbuf);
	printf("本次连接的地址是:%s\n",tempbuf);
//	nNum=tuxputenv("WSINTOPPRE71=YES");
	
	if (tpinit((TPINIT *) tpinitbuf) == -1)
	{
		(void) fprintf(stderr, "Tpinit failed\n");
		printf("ErrorNo:%d",tperrno);
		return -1;
	}
	return 0;
}


int CTuxedo::Td_tpterm(char *buf)
{
	if(buf!=NULL)
	{
		tpfree(buf);
		buf=NULL;		
	}
	return tpterm();
}


//密码检证



//1.号码费用查询(查询单个号码的费用)
int CTuxedo::AGetAllBill(char *wsaddrlist,char *pPhone,char *pBeginTime,CSHPPRequest *m_transRequest,char *linecount,char *totalfee,char *pErrinfo)
{	
//	return 1000;
	//初始化	
//	if(Td_Init("//10.110.2.151:15500")!=0)//wsaddrlist
	if(Td_Init(wsaddrlist)!=0)//wsaddrlist
		return 1000;

	FBFR32 * SndBuf = NULL;
	try
	{
		SndBuf=(FBFR32 *)tpalloc("FML32",NULL,1024);
	}
	catch(...)
	{
		Td_tpterm(NULL);
		return 1001;
	}
	if(SndBuf == NULL)
	{
		Td_tpterm(NULL);
		return 1001;
	}
	
	char select_type[2];   //话单类型
	char time_type[2];     //时间类型
	char time_string[29];  //时间串
	char login_accept[2];  //日志流水
	char today[10];         //当前时间
	char lines[10]="18"; 
	char show_flag[10]="1";
	
	strcpy(select_type,"0");

	strcpy(time_type, "1");//按出帐月查询

	strncpy(time_string,pBeginTime,6); 
	time_string[6]='\0';
	
	strcpy(login_accept,"");
	login_accept[1]='\0';
	strcpy(today,"");
	today[1]='\0';


	//
	if(Fchg32(SndBuf,SEND_PARMS_NUM32,0,"8",(FLDLEN)0) < 0 )			
    {			
 		Td_tpterm((char *)SndBuf);
		return 1002;
    }
	//操作工号
	if(Fchg32(SndBuf,GPARM32_0, 0, "caa131",(FLDLEN)0) < 0 )
    {			
		Td_tpterm((char *)SndBuf);
		return 1002;
    }
	if(Fchg32(SndBuf,GPARM32_1, 0, pPhone,(FLDLEN)0) < 0 )
    {			
		Td_tpterm((char *)SndBuf);
		return 1002;
    }
	if(Fchg32(SndBuf,GPARM32_2, 0, select_type,(FLDLEN)0) < 0 )
    {			
		Td_tpterm((char *)SndBuf);
		return 1002;
    }
	if(Fchg32(SndBuf,GPARM32_3, 0, time_type,(FLDLEN)0) < 0 )
    {			
		Td_tpterm((char *)SndBuf);
		return 1002;
    }
	if(Fchg32(SndBuf,GPARM32_4, 0, time_string,(FLDLEN)0) < 0 )
    {			
		Td_tpterm((char *)SndBuf);
		return 1002;
    }
	if(Fchg32(SndBuf,GPARM32_5, 0, login_accept,(FLDLEN)0) < 0 )
    {			
		Td_tpterm((char *)SndBuf);
		return 1002;
    }
	if(Fchg32(SndBuf,GPARM32_6, 0, today,(FLDLEN)0) < 0 )
    {			
		Td_tpterm((char *)SndBuf);
		return 1002;
    }	
	//
	if(Fchg32(SndBuf,GPARM32_7, 0, lines,(FLDLEN)0) < 0 )
    {			
		Td_tpterm((char *)SndBuf);
		return 1002;
    }

	//
	if(Fchg32(SndBuf,RECP_PARMS_NUM32,0,"1",(FLDLEN)0)< 0 )			
    {			
		Td_tpterm((char *)SndBuf);
		return 1002;
    }
	//
	if(Fchg32(SndBuf,RECP_PARMS_NUM32,0,"1",(FLDLEN)0)< 0 )			
    {			
		Td_tpterm((char *)SndBuf);
		return 1002;
    }
	
	//开始调用服务 连接
	int irecvcd = 20;
	char ServiceName[20];
	strcpy(ServiceName,"s1510_printnew");

	irecvcd = tpconnect((char*)ServiceName,(char *)SndBuf,0,TPRECVONLY);
	if(irecvcd==-1)	
	{
		(void)fprintf(stderr,"tpconnect failed tperrno %d %s\n", tperrno, tpstrerror(tperrno));
		tpfree((char*)SndBuf);SndBuf=NULL;
		tpterm();
		return 1003;
	}
//===========================
//Fprint(SndBuf);	
//=================================
//申请调用服务的接受内存	
	tpfree((char*)SndBuf);
	SndBuf=NULL;//及时释放

	char *messbuf    =NULL; //发送确认信息的时候使用
	FBFR32 * RcvBuf = NULL;	//接受的时候使用

	RcvBuf=(FBFR32 *)tpalloc("FML32",NULL,4*1024);//gengj 2005-8-25 修改缓冲区大小为原有的20倍
	messbuf=(char *)tpalloc("STRING",NULL,7);
	if(RcvBuf == NULL)
	{		
		Td_tpterm((char *)SndBuf);
		return 1001;
	}

	//读取数据
	long revent = 0;
	long buflen = 0;
	char rpt_message[4096];
	int  ret;
	int  recordnumber=0;//返回记录的条数

	//发送监控信息
	strncpy(msgbuf,pErrinfo,strlen(pErrinfo));
	strncpy(msgbuf+23,"[07]",4);
	SendMsg(msgbuf);
	printf("接受用户 %s 的数据开始\n",pPhone);
	
	//开始读取数据
	char *pchBuffer=NULL;
	int nBuffSize =200 * 256;//150*1024;
	int bufsize=0;

	pchBuffer = (char *)malloc(nBuffSize);
	if(pchBuffer==NULL)//申请完了要判断
	{
		printf("********pchBuffer申请内存失败************\n");
		tpfree((char*)SndBuf);
		SndBuf=NULL;
		tpfree((char*)RcvBuf);
		RcvBuf=NULL;
		tpfree(messbuf);
		messbuf=NULL;
		tpterm();
		return 1001;//没有内存了		
	}

	try{//捕捉异常	
		while (1)
		{
			buflen=4096;//gengj 2005-8-25 修改接收长度为原来的20倍
			Finit32(RcvBuf,(FLDLEN32)Fsizeof32(RcvBuf));

			ret = tprecv(irecvcd,(char **)&RcvBuf,&buflen,TPNOCHANGE,&revent) ;
			if (( ret == -1 ) && (revent != TPEV_SVCSUCC) && revent != TPEV_SENDONLY )
			{
				printf("(%i) tprecv err:%s(%i) %i\n",	tpurcode,tpstrerror(tperrno),tperrno,__LINE__);
				//strncpy(queryack.ret_code, "0009", 5);
				tpfree((char*)SndBuf);
				SndBuf=NULL;

				tpfree((char*)RcvBuf);
				RcvBuf=NULL;

				tpfree(messbuf);
				messbuf=NULL;

				memset(pchBuffer,'\0',nBuffSize);
				free((char*)pchBuffer);	
				tpterm();
				
				return 1004;
				
			}
			
			if ( (revent==TPEV_SVCERR) || ( revent==TPEV_SVCFAIL ) )
			{
				/* tpurcode 是服务端返回的用户自定义的返回码 */
	//			if ( tpurcode == 10)
	//			{
					tpfree((char*)SndBuf);SndBuf=NULL;
					tpfree((char*)RcvBuf);RcvBuf=NULL;
					tpfree(messbuf);messbuf=NULL;
					tpterm();

					memset(pchBuffer,'0',nBuffSize-2);
					pchBuffer[nBuffSize-1]='\0';
					free((void*)pchBuffer);			
					return 1005;
			}
			
			recordnumber = 0;
			recordnumber = Foccur32(RcvBuf,F_RECV); /* 获得一次接收到的结果集的条数 */		
			strcpy(rpt_message,"\0");
			
			if ( recordnumber == 0 ) break;		
			for (int i=0; i<recordnumber ;i++)
			//for (int i=0; i<20 ;i++)
			{
				memset(rpt_message,'\0',4096);	
				
				/* 从接收缓冲区中取出每条结果 */
				if ( Fget32(RcvBuf,F_RECV,i,(char *)rpt_message,NULL) < 0 )
				{
					printf("Fget 出错\n");
					printf("(%i) tpsend err:%s(%i) %i\n",tpurcode,tpstrerror(tperrno),tperrno,__LINE__);

					tpfree((char*)SndBuf);SndBuf=NULL;
					tpfree((char*)RcvBuf);RcvBuf=NULL;
					tpfree(messbuf);messbuf=NULL;
					tpterm();
					memset(pchBuffer,'0',nBuffSize-2);
					pchBuffer[nBuffSize-1]='\0';
					free((void*)pchBuffer);			
					return 1005;
				}
				if(strlen(rpt_message)>4096)
				{
					printf("(%i) tpsend err:%s(%i) %i\n",tpurcode,tpstrerror(tperrno),tperrno,__LINE__);
					tpfree((char*)SndBuf);SndBuf=NULL;
					tpfree((char*)RcvBuf);RcvBuf=NULL;
					tpfree(messbuf);messbuf=NULL;
					tpterm();
					memset(pchBuffer,'0',nBuffSize-2);
					pchBuffer[nBuffSize-1]='\0';
					free((void*)pchBuffer);			
					return 1005;
				}
				if((bufsize+strlen(rpt_message)) >= nBuffSize)
				{
					nBuffSize += nBuffSize;
					pchBuffer = (char*)realloc(pchBuffer,nBuffSize);
					if(pchBuffer == NULL)
					{
						printf("################################\n");
						printf("!!!!!!!!申请内存失败!!!!!!!!!!!!\n");
						printf("################################\n");
						tpfree((char*)SndBuf);SndBuf=NULL;
						tpfree((char*)RcvBuf);RcvBuf=NULL;
						tpfree(messbuf);messbuf=NULL;
						//memset(pchBuffer,'0',(nBuffSize/2)-2);
						//pchBuffer[(nBuffSize/2)-1]='\0';
						free((void*)pchBuffer);			
						pchBuffer=NULL;
						tpterm();					
						return 1000;
					}
				}
				strcpy(pchBuffer+bufsize,rpt_message);
				bufsize=bufsize+strlen(rpt_message);								
					
			}
					
			strcpy(messbuf,"RecvOK");		
			if( revent == TPEV_SENDONLY)
			{
				ret = tpsend(irecvcd,(char *)messbuf,strlen(messbuf),TPRECVONLY,&revent);
				/* 给服务端送接收状态 */			
				if ( ret ==-1)
				{
					printf("(%i) tpsend err:%s(%i) %i\n",tpurcode,tpstrerror(tperrno),tperrno,__LINE__);
					tpfree((char*)SndBuf);SndBuf=NULL;
					tpfree((char*)RcvBuf);RcvBuf=NULL;
					tpfree(messbuf);messbuf=NULL;
					tpterm();
					//memset(pchBuffer,'0',nBuffSize-2);
					//pchBuffer[nBuffSize-1]='\0';
					free((void*)pchBuffer);			
					return 1005;
				}
			} 
			else 
			{
				//writelog("Return event not equal TPEV_SENDONLY !!!\n");
				printf("Return event not equal TPEV_SENDONLY !!!\n");
			}
			
		}  /* end while (1) */
	}//匹配catch{while(1)}

	catch(...)
	{
		if(SndBuf!=NULL){tpfree((char*)SndBuf);SndBuf=NULL;}
		if(RcvBuf!=NULL){tpfree((char*)RcvBuf);RcvBuf=NULL;}
		if(messbuf!=NULL){tpfree(messbuf);messbuf=NULL;}
		if(pchBuffer!=NULL)
		{
			free((void*)pchBuffer);			
			pchBuffer=NULL;
		}
		tpterm();
		return 1005;	
	}
	
	if(SndBuf!=NULL){tpfree((char*)SndBuf);SndBuf=NULL;}
	if(RcvBuf!=NULL){tpfree((char*)RcvBuf);RcvBuf=NULL;}
	if(messbuf!=NULL){tpfree(messbuf);messbuf=NULL;}
	tpterm();

	//判断是否出差
	if(strstr(pchBuffer,"0000000000000")!=NULL)
	{
		printf("###0000000000000000000000000000##\n");
		free((void*)pchBuffer);	
		pchBuffer=NULL;
		return 1000;
	}
	else if(pchBuffer[0]=='\0')
	{
		free((void*)pchBuffer);	
		pchBuffer=NULL;
		return 1005;		
	}

	//发送监控信息
	strcpy(msgbuf+23,"[08]");
	SendMsg(msgbuf);
	printf("解析用户 %s 的数据开始\n",pPhone);
	
	m_tempfee =0.0;
	m_tempcount=0;
	linecount=0;
	m_pShppRequest = m_transRequest;
	

	if(SendtoClient(pchBuffer,pPhone)!=0)//pchBuffer是pPhone的话单详单字符串
	{
		printf("分解 %s 详单异常出错\n",pPhone);
		if(pchBuffer!=NULL)
		{
			//memset(pchBuffer,'0',nBuffSize-2);
			//pchBuffer[nBuffSize-1]='\0';
			free((void*)pchBuffer);			
			pchBuffer=NULL;
		}
		linecount=0;
//		m_pnLineCount=0;

		return 1006;
	}
	if(pchBuffer!=NULL)
	{
		//memset(pchBuffer,'0',nBuffSize-2);
		//pchBuffer[nBuffSize-1]='\0';
		free((void*)pchBuffer);			
		pchBuffer=NULL;
	}
	printf("解析用户 %s 的数据结束\n",pPhone);
	m_pShppRequest=NULL;
	return 0;
	
}
//=====================================================
//根据文件名解析数据并发送到客户端
//
//=====================================================
int CTuxedo::SendtoClient(char *filename,char *phone)
{

//	char rebuf[25600];//用于存放读文件一行的信息

⌨️ 快捷键说明

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