民生银行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所有的配置文件。
ﻬ三详细程序设计及流程说明
3。1主程序模块框图
启动应用
初始化应用 1.读配置表BstServ.cfg 2.初始化MAP结构
申请初始工作密钥 3.初始化包头配置结构
主进程
有连接申请?
子进程
接收CLIENT数据
是RQK 交易? | Y | 从加密机申请密钥 |
N
调用DoWithHost与主机
通信
返回响应数据包
关闭SOCKET
释放MAP结构
退出子进程
说明:
(1)配置表BstServ。cfg中定义了与WEBSERVER的SOCKET连接的PORT,与ELINK连接的IP地址和PORT端口。
(2)初始化MAP结构是将银行的主机接口数据格式定义文件(MAPFILE文件)全部用动态链表实现,以便提高访问速度。有关说明在后面章节。
(3)初始化包头配置结构,是将MAPFILE定义的报文头的配置表载入到全局变量Sys_Head中,也为了提高访问速度。具体配置见后面章节.
(4)将子进程中的MAP结构链表释放,防止占用内存.
ﻬ
3.2主机通信模块框图(DoWithHost()函数)
功能:打主机包—>发送—>接收-〉解包—〉组返回响应包
开始 | 初始化POOL 结构 | PackHostData() |
查找链表中相应交易结点
与ELINK建立连接
按Sys_Head组交易包头
调用PackHostData()组包 | 有PAPSWD? | Y | 与加密机交换 |
PINBLOCK |
N
按输入MAP组交易数据发送主机数据包
将POOL转换为主机报文
释放POOL结构,返回
接收主机数据包
初始化POOL 结构 | PackResponseData() |
调用PackResponseData解包
将主机响应包转为POOL
关闭SOCKET(与ELINK) | 打印POOL 到屏幕 | Y | 根据POOL 组返回拒 |
返回数据包长度 | 主机拒绝包? | 绝包 | |
N |
根据输出MAP组返回数据包
FORM 单元? | Y | 调用UnpackForm() |
解释FORM 单元 |
N
释放POOL结构
返回下传数据包长度
3。3MAPFILE动态链表结构
MAPFILE链表的结构定义在ltable.h中,如下:
#defineTMAPstructT_Map
#defineTINDEXstructT_Index
structT_Map{
charTname[16];
ﻩint Tlen;
ﻩ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上送来的密码字段原样送主机。
三. | 与WEBSERVER 通信数据包格式说明 |
4.1BST上送包格式
设备号 | 交易码 | 密钥 | 保留字段 | 交易包头部分 | 交易数据部分 |
5byte | 4byte | 16byte | 25 个字符零 | 用|分隔,数据域定长 | 用|分隔,数据域变长 |
前50个字节为与WEBSERVER的约定报文头。
其中,交易包头部分的定义在./syscfg/下,由三个配置文件定义:
system_head.cfg
cmtran_head.cfg
tran_head.cfg具体内容请看配置文件。
该部分中的数据域的顺序和据域的长度必须完全符合上述三个文件的定义,不能少送所有的域.对BST设备端不知道的数据(如交易目的地址),用同样长度的空格代替,其值由SER
VER自己处理(为方便对交易包头的处理,将这三个文件组合成Head_Value.cfg,具体说
明见后面章节)。
交易数据部分的定义为相应的MAPFILE,如1510交易的输入MAPFILE为(O15100). 该部分数据域的的顺序必须符合该MAPFILE的定义,长度可以是变长,用‘|’进行分隔即可。无数据域不添值,但要用‘|’分隔的空域。
注意:加密后的PINBLOCK(密码和新密码均是)为十六位,存放在相应的数据域中。
申请密钥交易数据包:
设备号 | 交易码 | 密钥 |
5byte | RQK1 或rqk1 | 字符0 16+25byte |
4.2返回数据包格式
SERVER对主机返回的数据包先转为POOL结构,再从该结构中按输出MAPFILE(如O15101)的定义将数据用‘|’分隔组成字符串下传。
4.2.1下传交易错误包
设备号 | 交易码 | 错误码 | 具体错误码 | 保留字段 |
5byte | 4byte | 3000 | 如3001 | 23 bytea |
下送包的约定报文头为40BYTE。
错误码为3000,与主机通信中有错误;文档最后有待扩充错误码表.
注意:如果上送的数据包小于50BYTE,对上送不进行解释,返回的设备号和交易码均返回为零,返回包如下:
B03105aaaaaaaaaaaaaaaaaaaaaaa
4。2。2下传RQK失败错误包
设备号 | 交易码 | 错误码 | 保留字段 |
5BYTE | 4BYTE | 2000 | 27 byte‘0' |
4。2.3下传RQK正确包
设备号 | 交易码 | 错误码 | 保留字段 | Working—key |
5BYTE | 4BYTE | 0000 | 27byte ‘0' | || |
Working—key为16位。
4。2。4下传主机拒绝包
设备号 | 交易码 | 错误码 | 保留字段 | |ERRNO| | ERRID| | ER |
5BYTE | 4BYTE | 1000 | 27byte 0 | 主机错误码 | 主机错误ID | 主机错误描述 |
后三个字段由./syscfg/ERR000文件定义,为主机返回的错误信息。SERVER用‘|’分隔变长数据。
4。2.5下传主机正确数据包
设备号 | 交易码 | 错误码 | 保留字段 | 输出MAP域 | 输出MAP 域 |
5byte | 4byte | 0000 | 27byte 0 | 用|分隔,数据域变长 | 当前记录数|记录字段数|记录……| |
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|…|(字段间也有竖线) |
4.2.6下传FORM无明细数据包
设备号 | 交易码 | 错误码 | 保留字段 | DDU数据 |
5BYTE | 4BYTE | 4000 | 27 byte ‘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
该文件定义了交易包头数据部分的字段及其赋值类型,
sysSADDRﻩ4ﻩ0#源地址,
sysDADDRﻩ4ﻩCﻩ#目的地址,c表示由交易码查询确定
sysRSRVDﻩ1ﻩ0#系统保留位
sysEFLAGﻩ1ﻩ0ﻩ#信息结束标志,默认为1
sysSEQNUMﻩ2ﻩ0ﻩ#报文序号,暂不使用,默认值为0
sysMACFLAGﻩﻩ1ﻩ0 #校验标志,是否需MAC校验或其他校验sysMACVALUEﻩ8ﻩ0ﻩ#校验值
PDWSNO ﻩ5ﻩRﻩ#交易发起终端号.r表示由BST的数据中获得
PDCTNO ﻩPDSBNO | 4N | #城市代码。n 表示添空格 | |||
4ﻩRﻩ#银行机构代码 | |||||
4 | 0 | #交易序号 | |||
2 | 0ﻩ#系统偏移1 | #PDTRLN 2ﻩ | |||
2 | 0 | #系统偏移2 |
PDAUUS | 8 | 0ﻩ#授权柜员 |
PDAUPS 8ﻩ0ﻩ#授权密码
说明:第一列为交易包头部分应有的字段,不能少;
第二列为该字段的长度,上送的字段长度必须与该定义一致;
第三列为字段赋值类型:
0 :由SERVER端为该字段赋值为0x00的串;
N :由SERVER端为该字段赋值为空格字符串;
R :SERVER端从上送请求包中相应的域中取值;
C :SERVER端根据tindex。cfg中每个交易的目的地址字段的定义来填写目的地址。
该表可以使解释上送请求包的数据时更加灵活。
‘#’后面是注释
5。3tindex。cfg
该文件是创建交易MAP链表结构的配置文件,它定义了四个字段:
交易码,交易输入MAPFILE文件名,交易输出MAPFILE文件名,该交易上送主机的目的地址。例如:
#交易码输入MAP输出MAP目的地址
1583 O15830O15831ﻩ00000000
1401ﻩO14010ﻩO14011ﻩ00000000
1482ﻩO14821ﻩO14822 00000000
1483 O14831O1483200000000
1485 O14851 O1485200000000
目的地址为字符串表示的四字节的十六进制值.程序会将其转为十六进制。
5.4关于FTP相关文件的配置
目前FTP下传文件是由ELINK方向BSTSERVER传送,使用的用户为:
USER:sot:cmbcsot
Path:/usr/sot
在bstsrv用户下有后台程序定时将下传的文件导入数据库的shell程序。内容如下:文件:bstsrvcron
#thisjobis load info database.
103***/usr/bstsrv/data/info.sh
文件:info.sh
#!/bin/sh
INFORMIXDIR=/usr/informix
INFORMIXSERVER=dbserver
exportINFORMIXDIR INFORMIXSERVER
PATH=$INFORMIXDIR/bin
exportPATH
/usr/bstsrv/data/info。sql
文件:info。sql
isql<<--!
ﻩdatabasebst_database;
deletefromgdrka;
loadfrom"/usr/sot"insert intogdrka;
deletefromgdrta;
loadfrom"/usr/sot"insertintogdrta;
ﻩdeletefromgdsba;
loadfrom"/usr/sot"insertintogdsba;
ﻩdeletefromgdxra;
loadfrom "/usr/sot”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。log
backlog.sh:
#backlog copyrightbyJiangHuaming
#ThisshellcanbackupTracediretoryforBSTCOMM-SERVER,whichorderbydate of month.
#2001/09/16
#querysystemdate
date+%d>a。log
readDate〈a.log
#definevariable
LogPath=/log/
TraceName=Trace
BackName=$HOME${LogPath}${TraceName}${Date}
#deleteoldbackup $HOME
ls$HOME${LogPath}>a.log
ifgrep${TraceName}${Date}a.log 〉b.log2〉&1
then
rm-r${BackName}
fi
cp-r ${TraceName}${BackName}
rma.log
rmb.log
#createnewTracedirectoryandlog ${TraceName}
rm*.LOG
cp/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数据错误
3113:FORM数据超出8K字节
七. | 新加银证通交易接口 |
证通交易使用与长天不同的通信接口及通信数据报文。所以需要定义新的与WEBSERVER的交易接口,但尽量保持原有风格。
7.1BST上送银证通包格式
设备号 | 交易码 | 密钥 | 交易子码 | 保留字段 | 交易数据部分 |
5byte | 4byte | 16byte | 8byte | 17个字符零 | 用|分隔,数据域变长 |
B0001 | YZTT | ***…*** | | 000…000 | |
7.2下传交易错误包
设备号 | 交易码 | 错误码 | 具体错误码 | 交易子码 | 保留字段 |
5byte | 4byte | 3000 | 如3200 | 8byte | 15bytea |
| | | | | |
下送包的约定报文头为40BYTE。
银证通交易的错误码从3200—3299。
7。3下传主机拒绝包
设备号 | 交易码 | 错误码 | 交易子码 | 保留字段 | |ERRNO| | ERRID| | ERRTEXT| |
5BYTE | 4BYTE | 1000 | 8byte | 19byte 0 | 主机错误码 | 主机错误ID | 主机错误描述 |
| | | | | | | |
后三个字段由。/syscfg/ERR000文件定义,为主机返回的错误信息。SERVER用‘|’分隔变长数据。
7.4下传主机正确数据包
设备号 | 交易码 | 错误码 | 交易子码 | 保留字段 | 输出MAP域 | 输出MAP 域 |
5byte | 4byte | 0000 | 8byte | 19byte0 | 用|分隔,数据域变长 | 当前记录数|记录字段数|记录……| |
| | | | | | |
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|…|(字段间也有竖线) |
7.5下传FORM无明细数据包
设备号 | 交易码 | 错误码 | 保留字段 | DDU数据 |
5BYTE | 4BYTE | 4000 | 27 byte ‘0’ | 用|分隔,数据域变长 |
新加错误码:
3201cannotconnectmidd
3202loginfailed
3204sendto midd error
3210socketindexerror,resulttype!=s/m
3211上送数据少于MAP定义
八. 新加开放基金交易接口变更2002-4-16
开放基金交易接口仍然走ELINK接口,与原来的接口基本一致,只要设置不同的目的地址,增加相应的交易配置文件即可.
须变更的地方是:开放基金接口中没有了密码校验方式的字段(pwkd),而原来的接口处理时要根据该标志来确定是否要与加密机进行PINBLOCK交换。所以为了与原来的接口处理相一致,必须在开放基金的接口中增加密码校验标志位.具体方式如下:
WEBSERVER上送的开放基金的交易报文中,包头部分中的保留字段的最后一位作为密码校验标志;‘1’表示要进行校验,须交换PINBLOCK;其他的值均默认为不做PINBLOCK交换,送‘0’。
开放基金之外的交易仍按原来的处理,即该位仍作为保留字段送空格即可。