📄 bank_svr.sqc.bak
字号:
#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 + -