?? tuxedo.cpp
字號:
/***************************************
* 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 + -