- 112.00 KB
- 2022-04-21 发布
- 1、本文档由用户上传,淘文库整理发布,可阅读全部内容。
- 2、本文档内容版权归属内容提供方,所产生的收益全部归内容提供方所有。如果您对本文有版权争议,请立即联系网站客服。
- 3、本文档由用户上传,本站不保证质量和数量令人满意,可能有诸多瑕疵,付费之前,请仔细阅读内容确认后进行付费下载。
- 网站客服QQ:403074932
南天电子信息股份有限公司FED民生银行BST数据通信服务器程序设计说明书一.设计概要该服务器程序主要完成的功能为:主要作为数据通信数据转发系统;在UNIX平台上开启一个TCP/IP协议的服务器端程序,通过SOCKET接口接收到BST的WEBSERVER转发的BST交易请求包时有子进程完成与主机的通信;子进程将请求包按照民生银行提供的MAPFILE(交易数据格式)进行数据重组,形成主机请求包,并与银行通信服务器(ELINK)建立socket连接,发送请求包,并接收主机响应包。最后将响应包按照MAPFILE输出格式解包并发送给WEBSERVER。另外要完成申请终端工作密钥,交易时与银行加密机进行密钥交换的工作。具体说明在后面章节说明。二.目录说明$HOME/include/所有的头文件,包括银行接口的。$HOME/lib/所有的库文件。$HOME/bin/运行目录。运行文件名为‘server’,运行./r为后台运行。$HOME/etc/mapfile银行数据接口定义文件。$HOME/etc/syscfg所有的配置文件。第12页—共12页n南天电子信息股份有限公司FED三详细程序设计及流程说明3.1主程序模块框图接收CLIENT数据主进程初始化应用申请初始工作密钥有连接申请?子进程是RQK交易?Y从加密机申请密钥N调用DoWithHost与主机通信返回响应数据包关闭SOCKET1.读配置表BstServ.cfg2.初始化MAP结构3.初始化包头配置结构释放MAP结构退出子进程启动应用说明:(1)配置表BstServ.cfg中定义了与WEBSERVER的SOCKET连接的PORT,与ELINK连接的IP地址和PORT端口。(2)初始化MAP结构是将银行的主机接口数据格式定义文件(MAPFILE文件)全部用动态链表实现,以便提高访问速度。有关说明在后面章节。(3)初始化包头配置结构,是将MAPFILE定义的报文头的配置表载入到全局变量 Sys_Head中,也为了提高访问速度。具体配置见后面章节。(4)将子进程中的MAP结构链表释放,防止占用内存。第12页—共12页n南天电子信息股份有限公司FED3.2主机通信模块框图(DoWithHost()函数)功能:打主机包->发送->接收->解包->组返回响应包初始化POOL结构查找链表中相应交易结点释放POOL结构,返回按Sys_Head组交易包头将POOL转换为主机报文按输入MAP组交易数据有PAPSWD?与加密机交换PINBLOCKYNPackHostData()PackResponseData()初始化POOL结构将主机响应包转为POOL打印POOL到屏幕主机拒绝包?根据POOL组返回拒绝包释放POOL结构返回下传数据包长度FORM单元?根据输出MAP组返回数据包调用UnpackForm()解释FORM单元YNYN与ELINK建立连接开始调用PackHostData()组包发送主机数据包接收主机数据包调用PackResponseData解包关闭SOCKET(与ELINK)返回数据包长度第12页—共12页n南天电子信息股份有限公司FED3.3 MAPFILE动态链表结构MAPFILE链表的结构定义在ltable.h中,如下:#defineTMAPstructT_Map#defineTINDEXstructT_IndexstructT_Map{charTname[16];intTlen;charTtype[1];structT_Map*next;}T_Map;structT_Index{charTcode[5];charinqname[16];charreqname[16];charendaddr[10];structT_Map*inq;structT_Map*req;structT_Index*next;}T_Index;每个交易对应一个T_Index结点,节点的Tcode为交易码;每个交易的结点中存放的信息有:交易码、输入MAP文件名、输出MAP文件名、交易目的地址、输入MAP链表的头指针和输出MAP链表的头指针。输入、输出MAP链表中分别储存了相应MAPFILE的前三个字段,以便打包、解包时使用。目前数据长度(intTlen)与数据类型(charTtype[1])暂时没有用到,保留以后使用。即,交易输入、输出时的交易数据(除交易包头外)的长度是变长的。3.4加密、验密方式的说明在服务器程序启动时,先向主机申请工作密钥,即发送9367交易;返回的PinKey保存在SERVER端。BST启动应用时先向SERVER发送RQK1交易包申请终端使用密钥;SERVER接收到RQK1交易时调用T_gt_working_key()函数向加密机申请,并将其返回给BST。BST做交易时,要将密钥(WorkingKey)和PinBlock上送至SERVER,SERVER要调用T_tr_pin_ansi_ansi()函数与加密机交换PinBlock,然后放在PAPSWD字段上送。更改密码交易的旧密码字段也同样要加密,密钥同上。注意:如果PSPWKD=1或者2时,SERVER会对PAPSWD和PAOLWD进行PINBLOCK的交换;如果PSPWKD=0或者没有该DDU字段时,认为不做PINBLOCK交换,SERVER会将BST上送来的密码字段原样送主机。第12页—共12页n南天电子信息股份有限公司FED一.与WEBSERVER通信数据包格式说明4.1BST上送包格式设备号交易码密钥保留字段交易包头部分交易数据部分5byte4byte16byte25个字符零用|分隔,数据域定长用|分隔,数据域变长前50个字节为与WEBSERVER的约定报文头。其中,交易包头部分的定义在./syscfg/下,由三个配置文件定义:system_head.cfgcmtran_head.cfgtran_head.cfg具体内容请看配置文件。该部分中的数据域的顺序和据域的长度必须完全符合上述三个文件的定义,不能少送所有的域。对BST设备端不知道的数据(如交易目的地址),用同样长度的空格代替,其值由SERVER自己处理(为方便对交易包头的处理,将这三个文件组合成Head_Value.cfg,具体说明见后面章节)。交易数据部分的定义为相应的MAPFILE,如1510交易的输入MAPFILE为(O15100)。该部分数据域的的顺序必须符合该MAPFILE的定义,长度可以是变长,用‘|’进行分隔即可。无数据域不添值,但要用‘|’分隔的空域。注意:加密后的PINBLOCK(密码和新密码均是)为十六位,存放在相应的数据域中。申请密钥交易数据包:设备号交易码密钥5byteRQK1或rqk1字符016+25byte4.2返回数据包格式SERVER对主机返回的数据包先转为POOL结构,再从该结构中按输出MAPFILE(如O15101)的定义将数据用‘|’分隔组成字符串下传。4.2.1下传交易错误包设备号交易码错误码具体错误码保留字段5byte4byte3000如300123bytea下送包的约定报文头为40BYTE。错误码为3000,与主机通信中有错误;文档最后有待扩充错误码表。第12页—共12页n南天电子信息股份有限公司FED注意:如果上送的数据包小于50BYTE,对上送不进行解释,返回的设备号和交易码均返回为零,返回包如下:B0000000030003105aaaaaaaaaaaaaaaaaaaaaaa4.2.2下传RQK失败错误包设备号交易码错误码保留字段5BYTE4BYTE200027byte‘0’4.2.3下传RQK正确包设备号交易码错误码保留字段Working-key5BYTE4BYTE000027byte‘0’||Working-key为16位。4.2.4下传主机拒绝包设备号交易码错误码保留字段|ERRNO|ERRID|ERRTEXT|5BYTE4BYTE100027byte0主机错误码主机错误ID主机错误描述后三个字段由./syscfg/ERR000文件定义,为主机返回的错误信息。SERVER用‘|’分隔变长数据。4.2.5下传主机正确数据包设备号交易码错误码保留字段输出MAPFILE的DDU域输出MAPFILE的FORM域5byte4byte000027byte0用|分隔,数据域变长当前记录数|记录字段数|记录……|FORM域的格式为:FORM文件名当前笔数记录字段数所有记录数据F1583|0012|0014|记录1|记录2|…|(字段间也有竖线)说明:PACOUT是该交易的总笔数,FORM域内的为当前笔数;FORM域的栏位数不下传,此处下传的是每条记录的字段数。如果FORM域的后面有DDU数据,那么将DDU数据解在FORM前面。FORM数据总是放在DDU数据之后。1409补登交易的FORM数据中有打印控制字符,起始打印行数和打印控制字符(列数+字体...),均为一个字节的十六进制值。所以总字节数为(1+1)*字段数。在程序中,列数和字体号均不下传,只有起始打印行数下传,所以1409交易的下传包为:FORM名当前笔数记录字段数打印起始行所有记录数据F1583|0012|0014|0010|记录1|记录2|…|(字段间也有竖线)第12页—共12页n南天电子信息股份有限公司FED4.2.6下传FORM无明细数据包设备号交易码错误码保留字段DDU数据5BYTE4BYTE400027byte‘0’用|分隔,数据域变长一.相关配置文件说明为了方便,配置文件也放在“./syscfg/”目录下。5.1BstServ.cfg该文件中配置了SERVER的初始化参数:SERVPORT=2001定义与WEBSERVER的SOCKET的端口HOSTIP=197.0.3.21定义ELINK(主机接口)的IP地址HOSTPORT=6999定义了ELINK的端口[GET_KEY]PATELR=06960001不同分行的机构号的设置;申请主密钥时使用。PAPSWD=88888888机构密码[FORM_NO]F1583=10定义了相应的FORM对象MAP文件中的字段数5.2head_value.cfg该文件定义了交易包头数据部分的字段及其赋值类型,sysSADDR40#源地址,sysDADDR4C#目的地址,c表示由交易码查询确定sysRSRVD10#系统保留位sysEFLAG10#信息结束标志,默认为1sysSEQNUM20#报文序号,暂不使用,默认值为0sysMACFLAG10#校验标志,是否需MAC校验或其他校验sysMACVALUE80#校验值PDWSNO5R#交易发起终端号。r表示由BST的数据中获得PDCTNO4N#城市代码.n表示添空格PDSBNO4R#银行机构代码PDUSID8R#交易柜员号PDTRCD4R#交易代码,TransCodePDTRSD20#交易子码PDTRMD10#交易模式PDTRSQ40#交易序号PDOFF120#系统偏移1#PDTRLN2PDOFF220#系统偏移2PDAUUS80#授权柜员PDAUPS80#授权密码第12页—共12页n南天电子信息股份有限公司FED说明:第一列为交易包头部分应有的字段,不能少;第二列为该字段的长度,上送的字段长度必须与该定义一致;第三列为字段赋值类型:0:由SERVER端为该字段赋值为0x00的串;N:由SERVER端为该字段赋值为空格字符串;R:SERVER端从上送请求包中相应的域中取值;C:SERVER端根据tindex.cfg中每个交易的目的地址字段的定义来填写目的地址。该表可以使解释上送请求包的数据时更加灵活。‘#’后面是注释5.3tindex.cfg该文件是创建交易MAP链表结构的配置文件,它定义了四个字段:交易码,交易输入MAPFILE文件名,交易输出MAPFILE文件名,该交易上送主机的目的地址。例如:#交易码输入MAP输出MAP目的地址1583O15830O15831000000001401O14010O14011000000001482O14821O14822000000001483O14831O14832000000001485O14851O1485200000000目的地址为字符串表示的四字节的十六进制值。程序会将其转为十六进制。5.4关于FTP相关文件的配置目前FTP下传文件是由ELINK方向BSTSERVER传送,使用的用户为:USER:sotftpPASSWD:cmbcsotPath:/usr/sotftp/ftpdata/在bstsrv用户下有后台程序定时将下传的文件导入数据库的shell程序。内容如下:文件:bstsrvcron#thisjobisloadinfofiletodatabase.103***/usr/bstsrv/data/info.sh文件:info.sh#!/bin/shINFORMIXDIR=/usr/informixINFORMIXSERVER=dbserverexportINFORMIXDIRINFORMIXSERVERPATH=$INFORMIXDIR/binexportPATH/usr/bstsrv/data/info.sql第12页—共12页n南天电子信息股份有限公司FED文件:info.sqlisql<<--!databasebst_database;deletefromgdrka;loadfrom"/usr/sotftp/ftpdata/DIBintrkind.txt"insertintogdrka;deletefromgdrta;loadfrom"/usr/sotftp/ftpdata/DIBintrrate.txt"insertintogdrta;deletefromgdsba;loadfrom"/usr/sotftp/ftpdata/DIBbranch.txt"insertintogdsba;deletefromgdxra;loadfrom"/usr/sotftp/ftpdata/DIBexchrate.txt"insertintogdxra;!一.TRACE文件说明1.Trace文件在‘./Trace/’目录下。Trace文件按设备号区分,每个设备对应自己的Trace文件。如,设备B0001的Trace文件名为:B0001.LOG。字母’B’表示不同设备类型;Trace文件中记录了通信数据,包括:WEBSERVER上送的请求包,用‘BST–>SERVER’表示。SERVER发送给主机的数据包,用‘SERVER–>HOST’表示。主机返回的数据包,用‘HOST–>SERVER’表示。SERVER返回给WEBSERVER的数据包,用‘SERVER–>BST’表示。Trace数据有两种形式:ASCII形式和十六进制。BstServ.LOG为服务程序初始化的LOG文件,记录所载入的参数。B9999.LOG为服务程序向主机申请密钥的LOG文件。Log为后台运行程序时屏幕输出的重定向文件。2.Trace文件的备份放在/usr/websrv/log/目录下,以当天日期为目录,每次备份会自动替换上月同日期的目录。即备份只有一个月以内的。Websrv用户下有后台进程每天自动进行TRACE的备份与删除工作。Websrvcron:002***/usr/websrv/bin/backlog.sh>aa.logbacklog.sh:#backlogcopyrightbyJiangHuaming#ThisshellcanbackupTracediretoryforBSTCOMM-SERVER,whichorderbydateofmonth.#2001/09/16第12页—共12页n南天电子信息股份有限公司FED#querysystemdatedate+%d>a.logreadDatea.logifgrep${TraceName}${Date}a.log>b.log2>&1thenrm-r${BackName}ficp-r${TraceName}${BackName}rma.logrmb.log#createnewTracedirectoryandlogfilecd${TraceName}rm*.LOGcp/dev/null./log一.可能扩充的错误码表3001:连接ELINK失败3002:向主机发送失败3003:读超时/失败3100:没有该交易的定义3101:head_value.cfg配置有错误3102:上送数据少于MAP定义3103:交换PINBLOCK失败3104:上送包数据转换错误(PackEucpSendStr)3105:请求包长度错误3106:PAPWKD密码校验方式不正确,该值必须是0,1,2其中之一。3110:主机响应包转换错误(UnpackEucpRecvStr)3111:解释FORM数据出错3112:接收FORM数据错误第12页—共12页n南天电子信息股份有限公司FED3113:FORM数据超出8K字节一.新加银证通交易接口证通交易使用与长天不同的通信接口及通信数据报文。所以需要定义新的与WEBSERVER的交易接口,但尽量保持原有风格。7.1BST上送银证通包格式设备号交易码密钥交易子码保留字段交易数据部分5byte4byte16byte8byte17个字符零用|分隔,数据域变长B0001YZTT***…***20000112000…0007.2下传交易错误包设备号交易码错误码具体错误码交易子码保留字段5byte4byte3000如32008byte15bytea20000112下送包的约定报文头为40BYTE。银证通交易的错误码从3200-3299。7.3下传主机拒绝包设备号交易码错误码交易子码保留字段|ERRNO|ERRID|ERRTEXT|5BYTE4BYTE10008byte19byte0主机错误码主机错误ID主机错误描述20000112后三个字段由./syscfg/ERR000文件定义,为主机返回的错误信息。SERVER用‘|’分隔变长数据。7.4下传主机正确数据包设备号交易码错误码交易子码保留字段输出MAPFILE的DDU域输出MAPFILE的FORM域5byte4byte00008byte19byte0用|分隔,数据域变长当前记录数|记录字段数|记录……|20000112FORM域的格式为:FORM文件名当前笔数记录字段数所有记录数据第12页—共12页n南天电子信息股份有限公司FEDF1583|0012|0014|记录1|记录2|…|(字段间也有竖线)说明:PACOUT是该交易的总笔数,FORM域内的为当前笔数;FORM域的栏位数不下传,此处下传的是每条记录的字段数。如果FORM域的后面有DDU数据,那么将DDU数据解在FORM前面。FORM数据总是放在DDU数据之后。1409补登交易的FORM数据中有打印控制字符,起始打印行数和打印控制字符(列数+字体...),均为一个字节的十六进制值。所以总字节数为(1+1)*字段数。在程序中,列数和字体号均不下传,只有起始打印行数下传,所以1409交易的下传包为:FORM名当前笔数记录字段数打印起始行所有记录数据F1583|0012|0014|0010|记录1|记录2|…|(字段间也有竖线)7.5下传FORM无明细数据包设备号交易码错误码保留字段DDU数据5BYTE4BYTE400027byte‘0’用|分隔,数据域变长新加错误码:3201cannotconnectmidd3202loginfailed3204sendtomidderror3210socketindexerror,resulttype!=s/m3211上送数据少于MAP定义一.新加开放基金交易接口变更2002-4-16开放基金交易接口仍然走ELINK接口,与原来的接口基本一致,只要设置不同的目的地址,增加相应的交易配置文件即可。须变更的地方是:开放基金接口中没有了密码校验方式的字段(pwkd),而原来的接口处理时要根据该标志来确定是否要与加密机进行PINBLOCK交换。所以为了与原来的接口处理相一致,必须在开放基金的接口中增加密码校验标志位。具体方式如下:WEBSERVER上送的开放基金的交易报文中,包头部分中的保留字段的最后一位作为密码校验标志;‘1’表示要进行校验,须交换PINBLOCK;其他的值均默认为不做PINBLOCK交换,送‘0’。开放基金之外的交易仍按原来的处理,即该位仍作为保留字段送空格即可。第12页—共12页