📄 capos.cpre
字号:
/* * This is a part of the Application Preconsole * - Channel Access - POS. * 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-09-18 HuangRunLang - create implemention file for * transaction entrance */ #include <sybtesql.h>#include "ap.h"EXEC SQL INCLUDE sqlca;EXEC SQL INCLUDE "pos.h";EXEC SQL INCLUDE "posext.h";/* * ASSURE宏用以处理程序中发生的异常。为适用于各个阶段的异常处理,该 * 宏对整个处理过程中可能分配的资源都进行清理。 */#define ASSURE(b) \ { \ if (!VERIFY(b)) \ { \ if (nListenSock > 0) \ close(nListenSock); \ if (nSock > 0) \ close(nSock); \ return EXCEPTION; \ } \ } #define ASSURE_NORMAL(r) \ { \ RESULT rTemp = (r); \ if (!VERIFY_NORMAL(rTemp)) \ { \ if (nListenSock > 0) \ close(nListenSock); \ if (nSock > 0) \ close(nSock); \ return rTemp; \ } \ }BOOL bShutdown = FALSE;RESULT main(UINT nArgCnt, PSTR pszArgVal[]){ COMMAREASTRU commareastru; char szPort[LEN_PORT + 1]; char szConvKeyTime[LEN_CONVKEYTIME + 1]; UINT nListenSock = 0; UINT nSock = 0; pid_t _pid_tChild; struct fd_set fds; char cMsg[SIZE_MSG_ISO8583 + 2 + SIZE_TPDU]; UINT nMsgSize, nSize; DETECT(nArgCnt == 2); DETECT(strlen(pszArgVal[1]) == 4); DETECT(memcmp(pszArgVal[1], "AP", 2) == 0); /* * 初始化服务程序,建立配置XML 结构,并获取TCP 套接字配置信息。 */ PrintLog(stdout, "capos: service is starting..."); ASSURE_NORMAL(InitServer()) PrintLog(stdout, "capos: get config parameters..."); bufclr(szPort); bufclr(szConvKeyTime); bufclr(commareastru.szMsgLen); ASSURE_NORMAL(AP_DEMAND_CFG(PATH_TCPPORT, szPort)) ASSURE_NORMAL(AP_DEMAND_CFG(PATH_CONVKEYTIME, szConvKeyTime)) /* * 建立监听套接字。 */ PrintLog(stdout, "capos: create listen socket..."); ASSURE_NORMAL(CreateSock(&nListenSock, atoi(szPort), 8)) PrintLog(stdout, "capos: service is activated."); while (!bShutdown) { if (!VERIFY_NORMAL(AcceptSock(&nSock, nListenSock))) continue; while (!bShutdown) { nSize = 2; bufclr(cMsg); FD_ZERO(&fds); FD_SET(nSock, &fds); select(nSock + 1, (struct fd_set *)&fds,(struct fd_set *)NULL, (struct fd_set *)NULL, NULL); /* * 因为网控发起下次连接可能需要一段时间,所以在从长连接套 * 接字中读取数据时,如果有错,将尽量避免立即关闭套接字, * 除非遇到套接字异常(已关闭)或报文超长等无法继续处理的错误。 */ if (!VERIFY_NORMAL(ReadFile(nSock, cMsg, &nSize)) || !VERIFY(nSize == 2) || !VERIFY((nMsgSize = (UCHAR)cMsg[0] * 256 + (UCHAR)cMsg[1]) <= SIZE_MSG_ISO8583)) { close(nSock); nSock = 0; break; } nSize = nMsgSize; bufclr(cMsg); if (!VERIFY_NORMAL(ReadFile(nSock, cMsg, &nSize)) || !VERIFY(nSize == nMsgSize)) { close(nSock); nSock = 0; break; } /* * 复制进程, 父进程继续读取TCP 套接字,子进程进行报文处理。 */ VERIFY((_pid_tChild = fork()) >= 0); if (_pid_tChild > 0) continue; goto process; } }process: close(nListenSock); nListenSock = 0; /* * 填充POS的通讯结构体 */ strcpy(commareastru.szConvKeyTime, szConvKeyTime); sprintf(commareastru.szMsgLen, "%06d", nSize); memcpy(commareastru.cMsg, cMsg, atol(commareastru.szMsgLen)); /* * CallCics 调用 CAPOS 处理交易 */ VERIFY_NORMAL(CallCics(pszArgVal[1], "APUSER", "APUSER", "CAPOS", "CPMI", &commareastru, sizeof(COMMAREASTRU))); ASSURE_NORMAL(WriteFile(nSock, commareastru.cMsg, atol(commareastru.szMsgLen))); close(nSock); return NORMAL;}/* End of this file */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -