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

📄 bank_svr.sqc.bak

📁 转发交易接口
💻 BAK
📖 第 1 页 / 共 2 页
字号:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sql.h>
#include <sqlenv.h>
#include <sqlda.h>
#include <sqlca.h>
#include <sqlutil.h>
#include <db2ApiDf.h>
#include <ctype.h>

# include <sys/types.h>
# include <sys/socket.h>
# include <sys/uio.h>
# include <sys/file.h>
# include <sys/ioctl.h>
# include <sys/errno.h>
# include <sys/wait.h>
# include <netinet/in.h>
# include <sys/select.h>
# include <sys/signal.h>
/*# include <sys/ipc.h>
# include <sys/msg.h>
# include <sys/shm.h>*/
# include <netdb.h>
# include <math.h>
# include <sys/stat.h>
# include <time.h>
# include <fcntl.h>
# include <unistd.h>

#include "public.h"
#include "dbpub.h"
#include "bankpack.h"


char localip[21];
int localport;
int TimeOut;

EXEC SQL BEGIN DECLARE SECTION;
    char dbAlias[15];
    char user[128 + 1];
    char pswd[15];
EXEC SQL END DECLARE SECTION;

void	sig_child();
void	sig_Terminate();

/*自助发卡机库存查询*/
void kccx(int rcvSocket, REQHEAD *reqpack);
/*清装卡情况明细查询*/
void zqkmxcx(int rcvSocket, REQHEAD *reqpack);
/*清装卡情况汇总查询*/
void zqkhzcx(int rcvSocket, REQHEAD *reqpack);
/*发卡明细*/
void famxcx(int rcvSocket, REQHEAD *reqpack);
/*返回银行组包并发送*/
void SendToBank(int rcvSocket, int retcode, int datalen, char *sndData);

main()
{
	char tmpstr[128], msg[256];
	int	listenSocket;
	int 	ret , fromlen, forkint;
	struct	sockaddr_in from, server;
    	struct timeval timeout;

	if (ReadConfg("DATABASE", "DBALIAS", dbAlias, "DBEBRS") < 0)
	{
		debugLog(__FILE__, __LINE__, "读[DATABASE]DBALIAS fail");
		exit( -1);
    	}
    	if (ReadConfg("DATABASE", "USER", user, "ebcs") < 0)
    	{
		debugLog(__FILE__, __LINE__, "读[DATABASE]USER fail");
        	exit( -1);
    	}
    	if (ReadConfg("DATABASE", "PASSWD", pswd, "ebcs") < 0)
    	{
		debugLog(__FILE__, __LINE__, "读[DATABASE]PASSWD fail");
        	exit( -1);
    	}
    	if (ReadConfg("BANK_SVR", "LOCALIP", localip, "127.0.0.1") < 0)
    	{
		debugLog(__FILE__, __LINE__, "读[BANK_SVR]LOCALIP fail");
        	exit( -1);
    	}
    	memset(tmpstr, 0x00, sizeof(tmpstr));
    	if (ReadConfg("BANK_SVR", "LOCALPORT", tmpstr, "8001") < 0)
    	{
		debugLog(__FILE__, __LINE__, "读[BANK_SVR]LOCALPORT fail");
        	exit( -1);
    	}
    	localport = atoi(tmpstr);
    	memset(tmpstr, 0x00, sizeof(tmpstr));
    	if (ReadConfg("BANK_SVR", "TIMEOUT", tmpstr, "60") < 0)
    	{
		debugLog(__FILE__, __LINE__, "读[BANK_SVR]TIMEOUT fail");
        	exit( -1);
    	}
    	TimeOut = atoi(tmpstr);

	signal( SIGCLD, sig_child );

	signal( SIGCLD, SIG_IGN );

	signal( SIGINT, sig_Terminate );

	signal( SIGQUIT, sig_Terminate );

	signal( SIGPIPE, sig_Terminate );

	signal( SIGTERM, sig_Terminate );

	signal( SIGUSR1, sig_Terminate );

	listenSocket = socket( AF_INET, SOCK_STREAM, 0 );

	if( listenSocket < 0 )

	{
		debugLog(__FILE__, __LINE__, "create listen socket fail.");
		exit( 1 );

	}

	server.sin_family = AF_INET;

	server.sin_addr.s_addr = htonl(INADDR_ANY);

	server.sin_port = htons( localport );

	if (bind( listenSocket, (struct sockaddr *)&server, sizeof(server)) < 0)
	{
		debugLog(__FILE__, __LINE__, "listen socket bind fail.");

		exit( 1 );

	}
        printf("listen....... \n");   
	listen( listenSocket, 5 );

	debugLog(__FILE__, __LINE__, "bank_svr listen is running" );

	for(;;)
	{
		int 	rcvSocket;

		fromlen = sizeof(server);

		rcvSocket = accept( listenSocket, (struct sockaddr *)&from, &fromlen );
		if( rcvSocket < 0 )
		{
			debugLog(__FILE__, __LINE__, "Accept fail.");

			sleep(10000);

			continue;

		}

		if( ( forkint = fork() ) < 0 )
		{

			debugLog(__FILE__, __LINE__, "fork child process fail.");
			sleep(10000);
			close(rcvSocket);
			continue;
		}

		else if ( forkint == 0) //child  process
		{
			char packlen[9];
			char jydm[7];
			int rcvlen, rlen, bodylen;
			fd_set fdr;
			REQHEAD reqpack;
 			printf("Create a Process....... \n");   
			close( listenSocket );
            		FD_ZERO(&fdr);
            		FD_SET(rcvSocket, &fdr);
            		timeout.tv_sec = TimeOut;
            		timeout.tv_usec = 0;
			
            		rcvlen = select(rcvSocket + 1, &fdr, (fd_set *)0, (fd_set *)0, &timeout); 
            		if (rcvlen <= 0)
            		{
              		  	debugLog(__FILE__, __LINE__, "Receive timeout select = %-d", rcvlen);
              		  	close(rcvSocket);
                		exit(0);
            		}
            		rcvlen = read(rcvSocket, packlen, PACKLENLEN);
            		if (rcvlen != PACKLENLEN)
            		{
                		debugLog(__FILE__, __LINE__, "receive pack len error len = %-d", rcvlen);
                		close(rcvSocket);
                		exit(0);
            		}
            		memset(&reqpack, 0x00, sizeof(REQHEAD));
            		rcvlen = read(rcvSocket, &reqpack, atoi(packlen));
            		if (rcvlen < sizeof(REQHEAD) - 2048)  //长度不够请求包头,REQHEAD中除TIATRDATA[2048]外
            		{
                		debugLog(__FILE__, __LINE__, "receive pack error len = %-d", rcvlen);
                		close(rcvSocket);
                		exit(0);
            		}
            		rcvlen = sizeof(REQHEAD) - 2048; 
            		/*不同交易做不同处理,银行发起的交易交易码放TIAFECODE中
            		//900000自助发卡机库存查询、900001自助发卡机清装卡情况明细查询
            		//900001自助发卡机清装卡情况汇总查询、900003发卡明细打印*/
            		memcpy(jydm, reqpack.TIAFECODE, 6);
            		
            		if (memcmp(reqpack.TIAFECODE, "900000", 6) == 0)
            		{
				/*自助发卡机库存查询*/
				debugLog(__FILE__, __LINE__, "发卡机库存查询receive bank req jydm = %s bodylen = %-d", jydm, rcvlen);
				kccx(rcvSocket, &reqpack);
            		}
            		/*
            		else if (memcmp(reqpack.TIAFECODE, "900001", 6) == 0)
            		{
				//清装卡情况明细查询
				debugLog(__FILE__, __LINE__, "清装卡情况明细查询receive bank req jydm = %s bodylen = %-d", jydm, rcvlen);
				zqkmxcx(rcvSocket, &reqpack);
            		}
            		else if (memcmp(reqpack.TIAFECODE, "900002", 6) == 0)
            		{
				//清装卡情况汇总查询
				debugLog(__FILE__, __LINE__, "清装卡情况汇总查询receive bank req jydm = %s bodylen = %-d", jydm, rcvlen);
				zqkhzcx(rcvSocket, &reqpack);
            		}
            		else if (memcmp(reqpack.TIAFECODE, "900003", 6) == 0)
            		{
				//发卡明细
				debugLog(__FILE__, __LINE__, "发卡明细receive bank req jydm = %s bodylen = %-d", jydm, rcvlen);
				famxcx(rcvSocket, &reqpack);
            		}
            		*/
			else
				debugLog(__FILE__, __LINE__, "receive unsupport pack");
			close(rcvSocket);
			exit(0);
		}
		else
		{
			/*wait(&errno);*/
			close( rcvSocket );
		}
	}
}

/*自助发卡机库存查询*/
void kccx(int rcvSocket, REQHEAD *reqpack)
{
	ANS_HEAD anspack;
  	struct sqlca sqlca;
  	char errorMsg[1024], snddata[4097];
  	int sndlen;
	int retcode;
	memset(snddata, 0x20, sizeof(snddata) - 1);
	snddata[sizeof(snddata) - 1] = 0x00;

	EXEC SQL BEGIN DECLARE SECTION;
		char termno[8]; /*自助机具号X(7)*/
  		long Records;
  		char lsh[32];
		char pc[32];     /*装/清卡编号(批次号)X(15)*/
		char jgh[32];    /*机构号X(7)*/
		char gyh[32];    /*当前加卡柜员X(07)*/
		char jkks[32];     /*初始卡数	9(8)*/
		char yeks[32];     /*剩余卡数	9(8)*/
		char hsks[32];     /*回收卡数	9(8)*/
		char ffks[32];     /*成功发卡	9(8)*/
		char kyks[32];     /*可疑卡数	9(8)*/
  		char tmpstr[36];
	EXEC SQL END DECLARE SECTION;

	memset(termno, 0x00, sizeof(termno));
	memcpy(termno, reqpack->TIATRDATA, 7);
	Alltrim(termno);
	memset(pc, 0x00, sizeof(pc));
	memcpy(pc, reqpack->TIATRDATA + 7, 15);
	Alltrim(pc);
	
  	EXEC SQL SELECT sbdm
   	 INTO :tmpstr
   	 FROM jqxxzt
   	 WHERE sbdm = :termno;
  	if (sqlca.sqlcode == 100)   /*无该发卡机处理*/                          
 	{                                                  
        	retcode = 1000; /*无该发卡机处理*/
        	strcpy(snddata, "无该发卡机设备");
  	        debugLog(__FILE__, __LINE__, "库存查询,无该发卡机设备termno = %s", termno);
        	SendToBank(rcvSocket, retcode, strlen(snddata), snddata);
        	return;
  	}
  	else if (sqlca.sqlcode != 0)   /*报错处理*/
  	{
                SqlInfoGet(errorMsg, &sqlca);
  	        debugLog(__FILE__, __LINE__, "select sql false SQLCODE = [%-d]%s\n", sqlca.sqlcode, errorMsg);
        	retcode = abs(sqlca.sqlcode)%10000; //
        	strcpy(snddata, errorMsg);
        	SendToBank(rcvSocket, retcode, strlen(snddata), snddata);
  	        return;
  	}
  	
  	//取当前库存
        	EXEC SQL SELECT Iss20, Iss8, Iss11, Iss18, Iss17
   	 	 INTO :jgh, :gyh, :jkks, :yeks, :hsks
   	 	 FROM CardBox
   	 	 WHERE Iss21 = :termno and Iss3 = :pc; 
		if (sqlca.sqlcode != 0)   /*报错处理*/
  		{
            		SqlInfoGet(errorMsg, &sqlca);
  	    		debugLog(__FILE__, __LINE__, "select sql false SQLCODE = [%-d]%s\n", sqlca.sqlcode, errorMsg);
        	        retcode = abs(sqlca.sqlcode)%10000; //
        	        strcpy(snddata, errorMsg);
        	        SendToBank(rcvSocket, retcode, strlen(snddata), snddata);
  	    		return;
  		}
  		
       	

⌨️ 快捷键说明

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