--------------------------------------------------------------------------------
标题: 远程调用内核接口(remote call kernel)
作者: 叶飞虎
版本: 5.0.0.0
日期: 2014.07.07
--------------------------------------------------------------------------------
1. 概述
RCK(remote call kernel 缩写)为远程调用内核, 其通讯协议为自定义数据流协议。
RCK 负责远程调用过程中的数据组织, 并不关心实际物理通讯协议, 实则属于逻辑层通讯
协议。
RCK 通讯槽接口(RCKSlot)负责数据接收和发送, 属于通讯的适配层, 由第三方来实现
实际的数据传输接口。
RCK 包含 Application, Function, Connection, Command, Response 和 Fields 六
大类, 其主要功能如下:
a. Application 类主要负责 Function 的组织和 Response 的分发执行;
b. Function 类主要负责 Function 的定义及按各模式调用;
c. Connection 类主要负责登录对端应用, Command 请求执行, Response 应答管理,
以及发送和接收数据等等;
d. Command 类主要负责函数参数传入, 以及返回值和返回字段值读取;
e. Response 类主要负责对端指定 Function 请求的执行处理, 如参数读取、返回
值编辑及提交;
f. Fields 类主要负责数据库字段值及定义集的组包和拆包。
RC 5.0 下载地址: http://download.csdn.net/detail/kyee/7610527
2. RCK 通讯槽接口定义
参见 <RCKSlot.h> 文件
// =======================================
// Unit : RCK Slot (RCK 通讯槽接口)
// Version: 5.0.0.0 (build 2014.07.07)
// Author : Kyee Ye
// Email : kyee_ye(at)126.com
// Copyright (C) Kyee workroom
// =======================================
#ifndef _RCKSlot_H_
#define _RCKSlot_H_
namespace RCKernel
{
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/* 常量定义 */
// 返回值及错误码
enum TRCKResult
{krSuccess = 1, // 成功
krFailure = 0, // 失败
krUnknown = -1, // 未知错误
krNotExist = -2, // 不存在(如: 连接对象)
krNotConnect = -3, // 连接未打开
krNonsupport = -4, // 不支持
krVersion = -5, // 版本不兼容
krTimeout = -6, // 操作超时
krPassword = -7, // 密码错误
krIsExisted = -8, // 已存在
krIsRefused = -9, // 被拒绝
krIsIllegal = -10, // 不合法
krIsNullName = -11, // 名字为空
krAttrInvalid = -12, // 属性无效
krStateInvalid = -13, // 状态无效
krHandleInvalid = -14, // 句柄无效
krAccessIllegal = -15}; // 存取非法
// 通讯槽的属性项
enum TRCKSlotAttrib
{ksaError = 0, // 通讯槽打开失败的错误信息
ksaState = 1, // 通讯槽的状态
ksaConnObj = 2, // 通讯槽的绑定连接对象
ksaCurrAddr = 3, // 通讯槽的本地地址
ksaCurrPort = 4, // 通讯槽的本地端口号
ksaPeerAddr = 5, // 通讯槽的对端地址
ksaPeerPort = 6, // 通讯槽的对端端口号
ksaSlotMaxSize = 7, // 通讯槽的数据包最大长度, 默认值: 8192
// 回调事件属性, 取值范围: [32..63]
ksaOnDisconnect = 32, // 通讯槽的 OnDisconnect 事件, 断开通讯(TRCKSlotOnEvent)
ksaOnRecvEvent = 33, // 通讯槽的 OnRecvEvent 事件, 接收事件(TRCKSlotOnEvent)
ksaOnRecvData = 34, // 通讯槽的 OnRecvData 事件, 接收数据(TRCKSlotOnRecvData)
// 扩展属性基数
ksaBaseExtended = 0x10000}; // 通讯槽的扩展属性基数: 扩展属性项
// (注: 扩展属性项必须小于 0x10000)
// 通讯槽的状态
enum TRCKSlotState
{kssInactive = 0, // 未打开
kssClosing = 1, // 正在关闭
kssOpening = 2, // 正在打开
kssOpened = 3}; // 已经打开
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/* 通讯槽对象的函数类型定义 */
// 操作通讯槽的函数类型
typedef void (__stdcall *TRCKSlotOp)(void* ASlotObj);
// 打开通讯槽的函数类型(返回值定义为 TRCKResult)
typedef long (__stdcall *TRCKSlotOpen)(void* ASlotObj, long ATimeout);
// 接收数据的函数类型(返回值为接收成功的数据尺寸, 若小于 0 则为错误码)
typedef long (__stdcall *TRCKSlotRecv)(void* ASlotObj, void* AData, long ASize);
// 发送数据的函数类型(返回值为发送成功的数据尺寸, 若小于 0 则为错误码)
typedef long (__stdcall *TRCKSlotSend)(void* ASlotObj, const void* AData, long ASize);
// 可以发送的函数类型(返回值为可以发送的数据尺寸, 若小于 0 则为错误码)
typedef long (__stdcall *TRCKSlotCanSend)(void* ASlotObj, long ASize);
// 取通讯槽整型属性的函数类型(返回值为属性值, ARetCode 为失败的返回码, 允许为空)
typedef long (__stdcall *TRCKSlotGetInt)(void* ASlotObj, long Attrib, long* ARetCode);
// 取通讯槽指针属性的函数类型(返回值为属性值, ARetCode 为失败的返回码, 允许为空)
typedef void* (__stdcall *TRCKSlotGetObj)(void* ASlotObj, long Attrib, long* ARetCode);
// 取通讯槽字符串属性的函数类型(返回值为属性值, ARetCode 成功时为属性值尺寸, 否则为返回码, 允许为空)
typedef char* (__stdcall *TRCKSlotGetStr)(void* ASlotObj, long Attrib, long* ARetCode);
// 设置通讯槽整型属性的函数类型
typedef long (__stdcall *TRCKSlotSetInt)(void* ASlotObj, long Attrib, long AValue);
// 设置通讯槽指针属性的函数类型
typedef long (__stdcall *TRCKSlotSetObj)(void* ASlotObj, long Attrib, void* AValue);
// 设置通讯槽字符串属性的函数类型
typedef long (__stdcall *TRCKSlotSetStr)(void* ASlotObj, long Attrib,
const char* AValue, long ASize);
// 通讯槽对象事件的回调函数类型
typedef void (__stdcall *TRCKSlotOnEvent)(void* ASlotObj, void* AConnObj);
// 通讯槽对象 OnRecvData 事件的回调函数类型
// 注: 若 Recv 方法为 NULL 则通过 OnRecvData 事件接收数据,
// 否则通过 OnRecvEvent 事件来调用 Recv 方法接收数据.
typedef void (__stdcall *TRCKSlotOnRecvData)(void* ASlotObj, void* AConnObj,
const void* AData, long ASize);
// 通讯槽对象的方法列表
#pragma pack(push, 1)
typedef struct
{
long Size; // = sizeof(TRCKSlotMethods)
TRCKSlotOpen Open; // 打开通讯槽
TRCKSlotOp Close; // 关闭通讯槽
TRCKSlotOp FreeObj; // 释放通讯槽对象
TRCKSlotRecv Recv; // 接收数据
TRCKSlotSend Send; // 发送数据
TRCKSlotCanSend CanSend; // 可以发送的数据尺寸
TRCKSlotGetInt GetInt; // 取通讯槽整型属性
TRCKSlotGetObj GetObj; // 取通讯槽指针属性
TRCKSlotGetStr GetStr; // 取通讯槽字符串属性
TRCKSlotSetInt SetInt; // 设置通讯槽整型属性
TRCKSlotSetObj SetObj; // 设置通讯槽指针属性
TRCKSlotSetStr SetStr; // 设置通讯槽字符串属性
} TRCKSlotMethods, *PRCKSlotMethods;
#pragma pack(pop)
}
#endif
3. RCK 接口定义
参见 <RCKernel.h> 文件
// =======================================
// Unit : RC Kernel
// Version: 5.0.0.0 (build 2014.07.07)
// Author : Kyee Ye
// Email : kyee_ye(at)126.com
// Copyright (C) Kyee workroom
// =======================================
#ifndef _RCKernel_H_
#define _RCKernel_H_
#include "RCKSlot.h"
#pragma comment(lib, "RCKernel.lib")
namespace RCKernel
{
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/* 常量定义 */
// 数据类型
enum TRCKDataType
{kdtNone = 0, // 无类型
kdtString = 1, // 字符串类型 (自定义尺寸)
kdtInteger = 2, // 整型类型 (4 Bytes)
kdtBoolean = 3, // 布尔类型 (1 Bytes)
kdtDouble = 4, // 浮点类型 (8 Bytes)
kdtStruct = 5, // 结构类型 (自定义尺寸)
kdtByte = 6, // 字节 (1 Bytes)
kdtWord = 7, // 双字节 (2 Bytes)
kdtSmallint = 8, // 16位整型 (2 Bytes)
kdtInt64 = 9, // 64位整型 (8 Bytes)
kdtDateTime = 10, // 日期时间类型(8 Bytes)
kdtCurrency = 11}; // 货币类型 (8 Bytes)
// 接口的属性项
enum TRCKAttrib
{kaVersion = 0, // 接口版本信息, 格式: "x.x.x.x (build yyyy.mm.dd)"
kaAppCount = 1, // 应用个数
kaCmdCount = 2, // 命令个数
kaConnCount = 3, // 连接个数
kaDealThreads = 4, // 处理线程最大个数, 默认值: 16
kaDealCacheSize = 5, // 处理线程缓冲池尺寸, 默认值: 16
kaSendThreads = 6, // 发送线程最大个数, 默认值: 8
kaSendCacheSize = 7, // 发送线程缓冲池尺寸, 默认值: 8
// 扩展属性基数
kaBaseAppObj = 0x10000, // 应用索引基数: 应用对象
kaBaseAppName = 0x20000, // 应用索引基数: 应用名
kaBaseConnObj = 0x40000}; // 连接索引基数: 连接对象
// 应用的属性项
enum TRCKAppAttrib
{kaaData = 0, // 自定义数据
kaaName = 1, // 应用名
kaaState = 2, // 应用的状态
kaaPassword = 3, // 应用的密码
kaaFuncCount = 4, // 应用的函数个数
kaaConnCount = 5, // 应用的已连接数
kaaMaxThreads = 6, // 应用的回调函数处理线程最大个数, 默认值: 8
kaaMaxConnCount = 7, // 应用的最大连接个数, 默认值: 0 表示无限制
// 回调事件属性, 取值范围: [32..63]
kaaOnConnLogin = 32, // 应用的 OnConnLogin 事件, 连接登录(TRCKOnAppLogin)
kaaOnConnLogout = 33, // 应用的 OnConnLogout 事件, 连接登出(TRCKOnAppLogout)
kaaOnExecResp = 34, // 应用的 OnExecResp 事件, 执行应答(TRCKOnAppResp)
kaaOnRespCancel = 35, // 应用的 OnRespCancel 事件, 应答已取消(TRCKOnAppResp)
kaaOnRespConfirm = 36, // 应用的 OnRespConfirm 事件, 应答已确认(TRCKOnAppResp)
// 扩展属性基数
kaaBaseFuncObj = 0x10000, // 应用的函数索引基数: 函数对象
kaaBaseFuncName = 0x20000, // 应用的函数索引基数: 函数名
kaaBaseConnObj = 0x40000}; // 应用的连接索引基数: 连接对象
// 应用的状态
enum TRCKAppState
{kasInactive = 0, // 函数未定义
kasDefining = 1, // 函数正在定义
kasDefined = 2, // 函数已定义
kasClosing = 3, // 正在关闭
kasOpening = 4, // 正在打开
kasOpened = 5}; // 已打开
// 函数的属性项
enum TRCKFuncAttrib
{kfaData = 0, // 自定义数据
kfaName = 1, // 函数名
kfaActive = 2, // 函数是否已激活
kfaAppObj