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

📄 capos.cpre

📁 商业银行前置系统
💻 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 + -