📄 bank_svr.sqc
字号:
#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 <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);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, "acidb") < 0) { debugLog(__FILE__, __LINE__, "读[DATABASE]DBALIAS fail"); exit( -1); } if (ReadConfg("DATABASE", "USER", user, "acidbo") < 0) { debugLog(__FILE__, __LINE__, "读[DATABASE]USER fail"); exit( -1); } if (ReadConfg("DATABASE", "PASSWD", pswd, "") < 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 ); } listen( listenSocket, 5 ); debugLog(__FILE__, __LINE__, "bank_svr listen is running" ); for(;;) { int rcvSocket; fromlen = sizeof(server); rcvSocket = accept( listenSocket, (struct sockaddr *)&from,(unsigned long*)&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) { char packlen[9]; char jydm[7]; int rcvlen, rlen, bodylen; fd_set fdr; REQHEAD reqpack; 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) { debugLog(__FILE__, __LINE__, "receive pack error len = %-d", rcvlen); close(rcvSocket); exit(0); } rcvlen = sizeof(REQHEAD) - 2048; 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 debugLog(__FILE__, __LINE__, "receive unsupport pack"); close(rcvSocket); exit(0); } else { 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 id = :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; } if(pc[0] == 0x00) { EXEC SQL SELECT count(*) INTO :Records FROM dr_jqxxmx WHERE Iss21 = :termno; } else { EXEC SQL SELECT count(*) INTO :Records FROM dr_jqxxmx 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;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -