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

📄 bms_host.c.bak

📁 UNIX/LINUX平台下面SMS网管原代码
💻 BAK
📖 第 1 页 / 共 2 页
字号:
#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 + -