📄 bms_host.c.bak
字号:
#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#include <sys/socket.h>#include <netinet/in.h>#include <netdb.h>#include <errno.h>#include "apgloble.h"#include "bms_micro.h"#include "etc.h"#include "api20.h"typedef struct{ char messageid[4 + 1]; char preserve[2 + 1]; char tail[1 + 1]; char txcode[6 + 1]; char txdate[10 + 1]; char txchanno[1 + 1]; } struct_header ;extern char etcfile[128];extern char Host_Ip[ 20 + 1] ;extern int Host_Port ;/* Local function */static int GetValueFromBigStruct(char *value, char *fieldno, BIG_STRC *bs);static int SetValueToBigStruct(BIG_STRC *bs, char *fieldno, char *value);static int GetErrorCode(char *buff, char *errcode);static int GetTxCode(short *ctype, char *hostcode, int optcode,int *incall_flag);static void pub_get_yearsecond(char *str) ; int UnPack(char *retbuf, BIG_STRC *bs, char *buf); int ProduceFile(char *packet, BIG_STRC *bs);static int GetTotalLines(int *lines, char *buffer, char *field);static int Pack_Head( char *p, BIG_STRC *bs, char *hostcode, short type);static int PackBody(FIELDINFO *pfield, BIG_STRC *bs);/* Globle function */int CallHost(char *recvbuff, BIG_STRC *bs);/* * function : CallHost */int CallHost(char *recvbuff, BIG_STRC *bs){ FIELDINFO *field = NULL ; char tempbuf[20480], buffer[24 + 1]; char txcode[6 + 1]; short ctype = 0 ; int flag; field = (FIELDINFO *)InitChain(); memset(txcode, 0, sizeof(txcode)); dp.sn = 0; if(GetTxCode(&ctype, txcode, bs->optcode,&flag) == FAILURE) { bs->result = HOST_TRADE_STOP ; return( FAILURE) ; } if(Pack_Head(buffer, bs, txcode, ctype) == FAILURE) { bs->result = PACK_HEAD_ERROR; return FAILURE; } if(PackBody(field, bs) == FAILURE) { bs->result = PACK_BODY_ERROR; return FAILURE; } bms_trace("PackBody %d",bs->optcode); if(CommHost(buffer, field, tempbuf,recvbuff,bs) != SUCCESS ) { return( FAILURE) ; } /*if(UnPack(recvbuff, bs, tempbuf) != SUCCESS) { return FAILURE; } */ return(SUCCESS) ;}int CommHost( char *Head, FIELDINFO *Body, char *Res,char *recvbuff, BIG_STRC *bs){ int sd = -1; int ret; char flag [1+1]; char orgfile[128]; char pLocate[30+1]; long detail_num ;//存放第一次收包时的总页次 memset(pLocate, 0, sizeof(pLocate)); /* *总行规定,网银前置回来的报文不大于1024 *如果明细查询一页大于1024就要多包返回, *在包头tail值不等于1就要继续收包 */ // STEP 1: 连接网银前置机 if ( (sd=ConnectServer( Host_Ip, Host_Port)) < 0 ) { bms_trace("Connect failed: [%s] [%d] [%d]", Host_Ip, Host_Port,sd) ; close( sd) ; bs->result = HOST_COMM_ERROR; return( FAILURE) ; } //STEP 2: 发送交易请求 if ( PutMessage( sd, Head, Body,bs->optcode)) { bms_trace( "SendMessage failed!") ; bs->result = HOST_COMM_ERROR; close( sd) ; return( FAILURE) ; } bms_trace( "PutMessage OK, waiting for response...\n"); //STEP 3: 生成明细临时用文件 memset(orgfile,'\0',sizeof(orgfile)); sprintf(orgfile,"%s/tmp/%s",getenv("HOME"),bs->address); unlink(orgfile); /* STEP 4: 取交易返回的第一个包 */ if ((ret = GetMessage( sd, Res)) == FAILURE) { bms_trace( "GetMessage failed, may time out!") ; bs->result = HOST_COMM_ERROR; close( sd) ; return( FAILURE) ; } //STEP 5: 取后续包标志 memcpy(flag,Res+6,1); //STEP 6: 解包 if(UnPack(recvbuff, bs, Res) != SUCCESS) { close( sd) ; return FAILURE; } strcpy(pLocate, bs->notes2); //STEP 7: 保存总页次 detail_num = bs->detail_num; //STEP 8: 如有后续包,重复STEP4---STEP6 while(atoi(flag)){ /* STEP 4: 取交易返回的第一个包 */ memset(Res,0x00,sizeof(Res)); if ((ret = GetMessage( sd, Res)) == FAILURE) { bms_trace( "Get Next Message failed, may time out!") ; bs->result = HOST_COMM_ERROR; close( sd) ; return( FAILURE) ; } //STEP 5: 取后续包标志 memcpy(flag,Res+6,1); //STEP 6: 解包 if(UnPack(recvbuff, bs, Res) != SUCCESS) { close( sd) ; return FAILURE; } } strcpy(bs->notes2, pLocate); bs->detail_num = detail_num; close( sd) ; return( SUCCESS) ;}static int Pack_Head( char *p, BIG_STRC *bs, char *hostcode, short ctype){ struct_header HEADER ; char tmp[24 + 1]; memset( &HEADER, '\0', sizeof( HEADER)) ; if ( ctype == 1) // 个人 { strcpy( HEADER.messageid, "0000") ; } else // 对公 { strcpy( HEADER.messageid, "1110") ; } strcpy(HEADER.preserve, "00") ; HEADER.tail[0] = '0' ;//1表示还要后续报 strcpy(HEADER.txcode, hostcode) ; pub_get_yearsecond(HEADER.txdate) ; HEADER.txchanno[0] = 'C' ; memset(tmp, 0, sizeof(tmp)); sprintf(tmp, "%s000%s%sC", HEADER.messageid, HEADER.txcode, HEADER.txdate); tmp[24] = 0; strcpy(p, tmp); return( SUCCESS) ;}/* * function : PackBody * input : optcode, BIG_STRC * : SUCCESS / FAILURE */static int PackBody(FIELDINFO *pfield, BIG_STRC *bs){ char key[64]; char bitmaps[512], TotalItem[7 + 1]; char host_field[3 + 1], bs_field[3 + 1]; char buffer[128]; int ItemNo = 0, i = 0; memset(bitmaps, 0, sizeof(bitmaps)); memset(key, 0, sizeof(key)); sprintf(key, "BITMAPS %04d", bs->optcode); if(GetValueFromEtcFile(etcfile, key, "REQUEST", bitmaps, 512) != ETC_OK ) { bms_trace("GetValueFromEtcFile FOR REQUEST of [%d] failed", bs->optcode); return FAILURE; } ItemNo = GetFieldCount(bitmaps, ','); if(ItemNo == 0) { bms_trace("No bitmaps defined in etcfile"); return FAILURE; } for(i = 0; i < ItemNo; i++) { memset(TotalItem, 0, sizeof(TotalItem)); GetField(bitmaps, ',', TotalItem, i + 1); GetField(TotalItem, ':', host_field, 1); GetField(TotalItem, ':', bs_field, 2); host_field[3] = 0; bs_field[3] = 0; memset(buffer, 0, sizeof(buffer)); GetValueFromBigStruct(buffer, bs_field, bs); PutTagValue(pfield, host_field, buffer); } return SUCCESS;}int UnPack(char *retbuf, BIG_STRC *bs, char *buf){ char ErrorCode[6 + 1], ErrorMsg[128]; char recvbuf[10240]; char bitmaps[512], key[128], TotalItem[7 + 1]; char host_field[3 + 1], bs_field[3 + 1], field[3 + 1]; char buffer[128]; int ItemNo = 0, i = 0; memset(recvbuf, 0x00, sizeof(recvbuf)); sprintf(recvbuf, "RET%s", buf); //if (debug) detail_log( recvbuf, strlen(recvbuf),bs->optcode, "收网银","tohost" ); memset(ErrorCode, 0, sizeof(ErrorCode)); GetErrorCode(recvbuf, ErrorCode); GetTagValue(recvbuf, 1, "012", ErrorMsg); if( strcmp(ErrorCode, "000000") != 0 ) { bms_trace("OptCode=[%d] ErrorCode=[%s] ErrorMsg=[%s]\n", bs->optcode,ErrorCode,ErrorMsg); Process_Host_Err(ErrorCode,&bs->result); memcpy(bs->notes10,ErrorCode,6); memcpy(bs->notes10+6,ErrorMsg,strlen(ErrorMsg)); //strcpy(bs->notes10,ErrorMsg); return FAILURE; } if (debug) bms_trace("ErrorCode = [%s] ErrorMsg = [%s]\n", ErrorCode,ErrorMsg); GetTagValue(recvbuf, 1, "010", bs->notes9); if (debug) bms_trace("网银机构流水号[%s]",bs->notes9); memset(bitmaps, 0, sizeof(bitmaps)); memset(key, 0, sizeof(key)); sprintf(key, "BITMAPS %04d", bs->optcode); if (debug) bms_trace("%s",key); if(GetValueFromEtcFile(etcfile, key, "RESPONSE", bitmaps, 512) != ETC_OK) { bms_trace("GetValueFromEtcFile FOR RESPONSE of [%d] failed", bs->optcode); return FAILURE; } if (debug) bms_trace("GetValueFromEtcFile FOR RESPONSE of [%d] SUCCESS", bs->optcode); ItemNo = GetFieldCount(bitmaps, ','); if(ItemNo == 0) { bms_trace("No bitmaps defined 0 in etcfile"); goto noresponse; } if (debug) bms_trace("UnPack ItemNo [%d] ", ItemNo); for(i = 0; i < ItemNo; i++) { memset(TotalItem, 0, sizeof(TotalItem)); GetField(bitmaps, ',', TotalItem, i + 1); GetField(TotalItem, ':', host_field, 1); GetField(TotalItem, ':', bs_field, 2); host_field[3] = 0; bs_field[3] = 0; memset(buffer, 0, sizeof(buffer)); GetTagValue(recvbuf, 1, host_field, buffer); SetValueToBigStruct(bs, bs_field, buffer); }noresponse: strcpy(retbuf, recvbuf); switch(bs->optcode){ case 3002://查当日明细 case 4002://查历史明细 case 3004://查当日明细 case 4004://查历史明细 case 1002://查对公当日明细 case 1003://查对公历史明细 case 3011://查定一本通余额明细 case 4011://查定一本通余额明细 //case 9036://查帐号 case 6103://查股票 case 6104://查当日成交 case 6105://查历史成交 case 6106://查委托 case 6107://查配号 case 6108://查交割 case 6109://查市值 case 7102://速汇通查询(笔数) case 7103://速汇通查询 case 9051://根据客户号查帐号 case 7002://公积金查询明细 if( ProduceFile(recvbuf, bs) == FAILURE) { bms_trace("ErrorMsg = [%s]\n", ErrorMsg); bs->result = PROCUDE_DETAIL_FILE_ERROR; return FAILURE; } break; default:break; } return SUCCESS;}int ProduceFile(char *packet, BIG_STRC *bs){ FILE *fax, *ivr; char bitmaps[512], key[128], TotalItem[7 + 1]; char host_field[3 + 1], bs_field[3 + 1], field[3 + 1]; char buffer[128], orgfile[128]; FILE *fp; int ItemNo = 0, i = 0, j = 0; int lines = 0; memset(bitmaps, 0, sizeof(bitmaps)); memset(key, 0, sizeof(key)); memset(TotalItem, 0, sizeof(TotalItem)); memset(buffer, 0, sizeof(buffer)); sprintf(key, "BITMAPS %04d", bs->optcode); /* if(GetValueFromEtcFile(etcfile, key, "RESPONSE", bitmaps, 512) != ETC_OK) { bms_trace("GetValueFromEtcFile FOR RESPONSE of [%d] failed", bs->optcode); return FAILURE; } bms_trace("GetValueFromEtcFile FOR RESPONSE of [%d] Success", bs->optcode); ItemNo = GetFieldCount(bitmaps, ','); if(ItemNo == 0) { bms_trace("No bitmaps defined in etcfile"); return FAILURE; } bms_trace("ProduceFile RESPONSE ItemNo [%d] ", ItemNo); for(j = 0; j < ItemNo; j++) { memset(TotalItem, 0, sizeof(TotalItem)); GetField(bitmaps, ',', TotalItem, j + 1); GetField(TotalItem, ':', host_field, 1); GetField(TotalItem, ':', bs_field, 2); host_field[3] = 0; bs_field[3] = 0; memset(buffer, 0, sizeof(buffer)); GetTagValue(packet, 1, host_field, buffer); SetValueToBigStruct(bs, bs_field, buffer); }*/ memset(bitmaps, 0, sizeof(bitmaps)); if(GetValueFromEtcFile(etcfile, key, "CONTENTS", bitmaps, 512) != ETC_OK) { bms_trace("GetValueFromEtcFile FOR CONTENT of [%d] failed", bs->optcode); return FAILURE; } ItemNo = GetFieldCount(bitmaps, ','); if(ItemNo == 0) { bms_trace("No bitmaps defined in etcfile"); return FAILURE; } bms_trace("ProduceFile CONTENT ItemNo [%d] ", ItemNo); memset(field, 0, sizeof(field)); GetField(bitmaps, ',', field, 1); if( GetTotalLines(&lines, packet, field) ) { bms_trace("Get Lines Error!"); return FAILURE; } bms_trace("ProduceFile GetTotalLines [%d] ", lines); memset(orgfile, 0, sizeof(orgfile)); sprintf(orgfile, "%s/tmp/%s", getenv("HOME"), bs->address) ; if( (fp = fopen(orgfile, "ab+")) == NULL ) { bs->result = FILE_OPEN_ERROR; strcpy(bs->notes10, "创建原文件失败"); return FAILURE; } for(i = 0; i < lines; i++) { memset(dp.sb[dp.sn].buf, '\0', sizeof(dp.sb[ dp.sn].buf)) ; /* FAX file */ for(j = 0; j < ItemNo; j++) { memset(field, 0, sizeof(field)); GetField(bitmaps, ',', field, j + 1); memset(buffer, 0, sizeof(buffer)); GetTagValue(packet, i + 1, field, buffer); strcat((char *)dp.sb[dp.sn].buf, buffer); strcat((char *)dp.sb[dp.sn].buf, "|"); } fprintf(fp,"%s\n",(char *)dp.sb[dp.sn].buf); dp.sn++; } fflush(fp); fclose(fp); return SUCCESS;}/* * The followings are local functions. */static void pub_get_yearsecond( char *str){ struct tm *current_time, time_buf ; time_t t1 ; current_time = &time_buf ; time( &t1) ; current_time = localtime ( &t1) ; current_time -> tm_year = current_time -> tm_year + 1900 ; sprintf( str , "%02d%02d%02d%02d%02d", current_time -> tm_mon + 1, current_time -> tm_mday, current_time -> tm_hour, current_time -> tm_min, current_time -> tm_sec) ; return ;}/* * function : GetValueFromBigStruct * input : fieldno, BIG_STRC * : SUCCESS / FAILURE */static int GetValueFromBigStruct(char *value, char *fieldno, BIG_STRC *bs){ char buffer[128]; memset(buffer, 0, sizeof(buffer)); switch(atoi(fieldno)) { case 0: strcpy(buffer, ""); break; case 1: sprintf(buffer, "%s", bs->teller); break; case 2: sprintf(buffer, "%d", bs->trade_serial); break; case 3: sprintf(buffer, "%d", bs->otrade_serial); break; case 4: sprintf(buffer, "%s", bs->flag); break; case 5: sprintf(buffer, "%d", bs->side); break; case 6: sprintf(buffer, "%d", bs->optcode); break; case 7: sprintf(buffer, "%s", bs->serv_type); break; case 8:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -