📄 spdsi.cpre
字号:
/* * This is a part of the Application Preconsole * Service Provide - DSI. * Copyright (C) 2000-2000 ABC.SDC. * All rights reserved. * * This source code is only intended as a supplement to the * Application Preconsole Reference and related * electronic documentation provided with the library. * See these sources for detailed information regarding the * Application Preconsole product. * * Update record: * 2001-08-12 Cheng WeiHong - create implementation file for * transaction entrance * 2001-09-25 R.Cao - simplify logic */#include <sybtesql.h>#include "ap.h"#include "apsp.h"EXEC SQL INCLUDE sqlca;EXEC SQL INCLUDE "dsi.h";EXEC SQL INCLUDE "dsiext.h";/* * ASSURE宏用以处理程序中发生的异常。为适用于各个阶段的异常处理,该 * 宏对整个处理过程中可能分配的资源都进行清理。 */#define ASSURE(b) \ { \ if (!VERIFY(b)) \ { \ if (nListenSock > 0) \ close(nListenSock); \ if (nSock > 0) \ close(nSock); \ DeleteIso8583(&iso8583stru); \ return EXCEPTION; \ } \ }#define ASSURE_NORMAL(r) \ { \ RESULT rTemp = (r); \ if (!VERIFY_NORMAL(rTemp)) \ { \ if (nListenSock > 0) \ close(nListenSock); \ if (nSock > 0) \ close(nSock); \ DeleteIso8583(&iso8583stru); \ return rTemp; \ } \ }BOOL bShutdown = FALSE;RESULT main(){ ISO8583STRU iso8583stru; UINT nListenSock = 0, nSock = 0; char szOutMsgKey[LEN_MSGKEY + 1]; char szInMsgKey[LEN_MSGKEY + 1]; char szPort[LEN_PORT + 1]; char szTimeout[2 + 1]; UINT nOutMsg; UINT nInMsg; pid_t _pid_tChild; char cMsg[SIZE_MSG_ISO8583]; UINT nSize, nMsgSize; UINT nType; char szTraceNo[SIZE_TRACENO + 1]; memset(&iso8583stru, 0, sizeof(ISO8583STRU)); PrintLog(stdout, "spdsi: service is starting..."); ASSURE_NORMAL(InitServer()) /* * 建立配置XML 结构,并获取消息队列和TCP 套接字的配置信息。 */ PrintLog(stdout, "spdsi: get config parameters..."); ASSURE_NORMAL(AP_DEMAND_CFG(PATH_OUTMSGKEY, szOutMsgKey)) ASSURE_NORMAL(AP_DEMAND_CFG(PATH_INMSGKEY, szInMsgKey)) ASSURE_NORMAL(AP_DEMAND_CFG(PATH_SERVICEPORT, szPort)) ASSURE_NORMAL(AP_DEMAND_CFG(PATH_TIMEOUT, szTimeout)) /* * 建立监听套接字,打开消息队列。 */ PrintLog(stdout, "spdsi: create listen socket..."); ASSURE_NORMAL(CreateSock(&nListenSock, atoi(szPort), 8)) ASSURE((nOutMsg = msgget(atoi(szOutMsgKey), IPC_CREAT | 0666)) > 0) ASSURE((nInMsg = msgget(atoi(szInMsgKey), IPC_CREAT | 0666)) > 0) PrintLog(stdout, "spdsi: service is activated."); while (!bShutdown) { if (!VERIFY_NORMAL(AcceptSock(&nSock, nListenSock))) continue; /* * 复制进程, 父进程继续监视TCP 套接字,子进程进行报文处理。 */ VERIFY((_pid_tChild = fork()) >= 0); if (_pid_tChild > 0) { close(nSock); nSock = 0; continue; } break; } close(nListenSock); nListenSock = 0; /* * 从TCP 套接字中读取4 个字节以确定交易报文的长度。 */ bufclr(cMsg); nSize = 4; ASSURE_NORMAL(ReadFile(nSock, cMsg, &nSize)) ASSURE(nSize == 4) nSize = nMsgSize = atoi(cMsg); bufclr(cMsg); ASSURE(nSize <= sizeof(cMsg)) ASSURE_NORMAL(ReadFile(nSock, cMsg, &nSize)) ASSURE(nSize == nMsgSize) close(nSock); nSock = 0; ASSURE_NORMAL(CreateIso8583(&iso8583stru, ifistruDsi)) ASSURE_NORMAL(ImportIso8583(&iso8583stru, cMsg, nSize)) nSize = SIZE_TRACENO; bufclr(szTraceNo); ASSURE_NORMAL(GetBitInIso8583(&iso8583stru, BIT_TRACENO, szTraceNo, &nSize)) DeleteIso8583(&iso8583stru); nType = TYPE_MSG_REQ; ASSURE_NORMAL(WriteMsg(nOutMsg, cMsg, nMsgSize, nType)) nSize = sizeof(cMsg); bufclr(cMsg); nType = atoi(szTraceNo); ASSURE_NORMAL(ReadMsgExt(nInMsg, cMsg, &nSize, &nType, atoi(szTimeout))) memset(&iso8583stru, 0, sizeof(ISO8583STRU)); CreateIso8583(&iso8583stru, ifistruDsi); ImportIso8583(&iso8583stru, cMsg, nSize); DeleteIso8583(&iso8583stru); ASSURE_NORMAL(CallCics("AP00", "APUSER", "APUSER", "DSIR", "CPMI", cMsg, nSize)) return NORMAL;}/* End of this file */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -