远程调用内核接口(remote call kernel)
--------------------------------------------------------------------------------
标题: 远程调用内核接口(remote call kernel)
作者: 叶飞虎
版本: 4.0.0.0
日期: 2013.09.12
--------------------------------------------------------------------------------
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 类主要负责数据库字段值及定义集的组包和拆包。
2. RCK 通讯槽接口定义
参见 <RCKSlot.h> 文件
// =======================================
// Unit : RCK Slot (RCK 通讯槽接口)
// Version: 4.0.0.0 (build 2013.08.17)
// 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
ksaOnDisconnect = 8, // 通讯槽的 OnDisconnect 事件, 断开通讯(TRCKSlotOnEvent)
ksaOnRecvEvent = 9, // 通讯槽的 OnRecvEvent 事件, 接收事件(TRCKSlotOnEvent)
ksaOnRecvData = 10, // 通讯槽的 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: 4.0.0.0 (build 2013.09.02)
// 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 表示无限制
kaaOnConnLogin = 8, // 应用的 OnConnLogin 事件, 连接登录(TRCKOnAppLogin)
kaaOnConnLogout = 9, // 应用的 OnConnLogout 事件, 连接登出(TRCKOnAppLogout)
kaaOnExecResp = 10, // 应用的 OnExecResp 事件, 执行应答(TRCKOnAppResp)
kaaOnRespCancel = 11, // 应用的 OnRespCancel 事件, 应答已取消(TRCKOnAppResp)
kaaOnRespConfirm = 12, // 应用的 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 = 3, // 函数所属应用对象
kfaRetType = 4, // 函数返回值类型
kfaRetSize = 5, // 函数返回值定义尺寸
kfaCallMode = 6, // 回调函数模式
kfaCallback = 7, // 回调函数指针
kfaParamCount = 8, // 函数的参数个数
kfaFieldCount = 9, // 函数的返回字段个数
kfaNeedConfirm = 10, // 函数应答返回是否需要确认
kfaNeedEncrypt = 11, // 函数参数和返回值在通讯中是否需要加密
kfaBaseParamName = 0x10000, // 函数参数索引基数: 参数名
kfaBaseParamType = 0x20000, // 函数参数索引基数: 参数类型
kfaBaseParamSize = 0x30000, // 函数参数索引基数: 参数定义尺寸
kfaBaseParamIsRef = 0x40000, // 函数参数索引基数: 参数是否为引用指针
kfaBaseFieldName = 0x60000, // 函数返回字段索引基数: 返回字段名
kfaBaseFieldType = 0x70000, // 函数返回字段索引基数: 返回字段类型
kfaBaseFieldSize = 0x80000}; // 函数返回字段索引基数: 返回字段定义尺寸
// 回调函数模式
enum TRCKFuncCallMode
{kfcmNone = 0, // 无, 请求通过 OnExecResp 事件返回
kfcmFixed = 1, // 固定的回调模式(TRCKDoFixed类型)
kfcmCdecl = 2, // C 语言调用协议
kfcmStdcall = 3, // API 标准调用协议
kfcmIDCdecl = 4, // 带 AResp 参数的 C 语言调用协议
kfcmIDStdcall = 5}; // 带 AResp 参数的 API 标准调用协议
// 连接的属性项
enum TRCKConnAttrib
{kcaError = 0, // 错误信息
kcaData = 1, // 自定义数据
kcaType = 2, // 连接的类型
kcaState = 3, // 连接的状态
kcaSlotObj = 4, // 连接绑定的通讯槽对象(用于TRCKSlotMethods方法列表)
kcaCanLogin = 5, // 连接是否能够登录对端应用, 默认值: (Type == kctTCPClient)
kcaCanBindApp = 6, // 连接是否能够绑定应用, 默认值: (Type == kctTCPSrvClient)
kcaBindAppObj = 7, // 连接绑定的应用对象, 默认值: NULL
kcaIsSyncLink = 8, // 通讯槽对象打开成功后是否同步建立连接, 默认值: (Type == kctTCPClient)
kcaSlotTimeout = 9, // 通讯槽对象的打开超时(单位: 毫秒), 默认值: 30000
kcaSlotMaxSize = 10, // 通讯槽对象的数据包最大长度, 默认值: 8192
kcaSendQueueSize = 11, // 连接的 RCKConnSendData 发送队列尺寸, 默认值: 256
kcaTimeout = 12, // 连接的操作超时(单位: 毫秒), 默认值: 30000
kcaAppName = 13, // 登录对端应用名
kcaAppPass = 14, // 登录对端应用密码
kcaCurrAddr = 15, // 连接的本地地址
kcaCurrPort = 16, // 连接的本地端口号
kcaPeerAddr = 17, // 连接的对端地址
kcaPeerPort = 18, // 连接的对端端口号
kcaLastTick = 19, // 连接的最后一次收发数据时 tick
kcaFuncCount = 20, // 已加载对端应用的函数个数, 默认值: -1 表示未加载
kcaKeepTimeout = 21, // 连接的心跳检测超时时间(单位: 毫秒), 默认值: 30000
kcaKeepInterval = 22, // 连接的心跳检测重试间隔(单位: 毫秒), 默认值: 10000
kcaKeepRetryTimes = 23, // 连接的心跳检测重试次数, 默认值: 3
kcaOnConnect = 24, // 连接的 OnConnect 事件, 连接成功(TRCKOnObjEvent)
kcaOnDisconnect = 25, // 连接的 OnDisconnect 事件, 断开连接(TRCKOnObjEvent)
kcaOnLogin = 26, // 连接的 OnLogin 事件, 登录对端应用(TRCKOnObjEvent)
kcaOnLogout = 27, // 连接的 OnLogout 事件, 登出对端应用(TRCKOnObjEvent)
kcaOnCmdReturn = 28, // 连接的 OnCmdReturn 事件, 命令返回(TRCKOnCmdReturn)
kcaOnRecvData = 29, // 连接的 OnRecvData 事件, 接收数据(TRCKOnRecvData)
kcaBaseSlotExt = 0x10000, // 通讯槽对象的扩展属性基数: 扩展属性项
kcaBaseFuncName = 0x20000}; // 已加载对端应用的函数索引基数: 函数名
// 连接的类型
enum TRCKConnType
{kctUnknown = 0, // (未知)
kctTCPClient = 1, // TCP 客户端
kctTCPSrvClient = 2, // TCP 服务端的客户连接
kctSHMClient = 3, // SHM 客户端(共享内存通讯)
kctSHMSrvClient = 4, // SHM 服务端的客户连接(共享内存通讯)
// ... ... // 可以根据 slot 通讯方式自定义扩充
};
// 连接的状态
enum TRCKConnState
{kcsInactive = 0, // 未打开
kcsClosing = 1, // 正在关闭
kcsOpening = 2, // 正在打开
kcsOpened = 3, // 已经打开
kcsLogouting = 4, // 正在登出对端应用
kcsLogging = 5, // 正在登录对端应用
kcsLogged = 6, // 已登录对端应用
kcsLoading = 7, // 正在加载对端应用函数列表
kcsLoaded = 8}; // 已加载对端应用函数列表
// 命令的属性项
enum TRCKCmdAttrib
{kmaData = 0, // 自定义数据
kmaName = 1, // 命令的函数名
kmaState = 2, // 命令的状态
kmaConnObj = 3, // 命令的连接对象
kmaRetType = 4, // 命令的返回值类型
kmaRetSize = 5, // 命令的返回值定义尺寸
kmaParamCount = 6, // 命令的参数个数
kmaFieldCount = 7, // 命令的返回字段个数
kmaExecResult = 8, // 命令的执行返回结果(值参见 TRCKCmdResult)
kmaEncrypted = 9, // 命令的参数和返回值在通讯中是否加密
kmaAppIsValid = 10, // 命令已开始的应用是否有效
kmaBaseParamName = 0x10000, // 命令的参数索引基数: 参数名
kmaBaseParamType = 0x20000, // 命令的参数索引基数: 参数类型
kmaBaseParamSize = 0x30000, // 命令的参数索引基数: 参数定义尺寸
kmaBaseFieldName = 0x60000, // 命令的返回字段索引基数: 返回字段名
kmaBaseFieldType = 0x70000, // 命令的返回字段索引基数: 返回字段类型
kmaBaseFieldSize = 0x80000}; // 命令的返回字段索引基数: 返回字段定义尺寸
// 命令返回结果
enum TRCKCmdResult
{kmrFailure = 0, // 失败
kmrSuccess = 1, // 成功
kmrException = 2, // 异常
kmrBreak = 3}; // 中止
// 命令状态
enum TRCKCmdState
{kmsIdle = 0, // 空闲
kmsEnding = 1, // 正在结束
kmsBeginning = 2, // 正在开始
kmsBegun = 3, // 已开始
kmsExecuting = 4, // 正在执行
kmsExecuted = 5, // 执行结束, 已返回
kmsCanceled = 6}; // 已取消(如: 超时等等)
// 应答状态
enum TRCKRespState
{krsIdle = 0, // 空闲
krsExecuting = 1, // 正在执行
krsWaitSend = 2, // 应答已执行, 正在等待发送
krsSending = 3, // 应答已执行, 正在发送
krsSent = 4, // 应答已执行, 应答发送完成
krsConfirmed = 5, // 应答已确认接收
krsCanceled = 6}; // 应答已取消
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/* 回调函数类型定义 */
// 固定的回调模式
typedef void (__stdcall *TRCKDoFixed)(void* AFuncObj, void* AResp);
// 对象事件的回调函数类型
typedef void (__stdcall *TRCKOnObjEvent)(void* AObject);
// 应用连接登录事件的回调函数类型(OnConnLogin)
typedef void (__stdcall *TRCKOnAppLogin)(void* AppObj, void* AConnObj, bool& AIsRefused);
// 应用连接登出事件的回调函数类型(OnConnLogout)
typedef void (__stdcall *TRCKOnAppLogout)(void* AppObj, void* AConnObj);
// 应用应答事件的回调函数类型(OnExecResp, OnRespCancel, OnRespConfirm)
typedef void (__stdcall *TRCKOnAppResp)(void* AppObj, void* AFuncObj, void* AResp);
// 连接命令返回事件的回调函数类型(AResult 值参见 TRCKCmdResult)
typedef void (__stdcall *TRCKOnCmdReturn)(void* AConnObj, void* ACmdObj, long AResult);
// 接收自定义数据的回调函数类型
typedef void (__stdcall *TRCKOnRecvData)(void* AConnObj, const void* AData, long ASize);
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/* 接口相关函数 */
// 接口初始化/释放函数
void __stdcall RCKInitialize();
void __stdcall RCKUninitialize();
// 接口版本信息, 格式: "x.x.x.x (build yyyy.mm.dd)"
// AVersion 返回版本号, 如: 0x0708090A 表示 7.8.9.10
char* __stdcall RCKGetVersion(long* AVersion);
// 取当前操作的最后错误码(注: 用于返回值非错误码的函数, 如 RCKConnCreate 等等)
long __stdcall RCKGetLastError();
// 在回调函数中取当前应用线程的应答
void* __stdcall RCKGetCurrResp();
// 根据应用名取应用对象
void* __stdcall RCKGetAppObj(const char* AName);
// 取接口属性
// (返回值为属性值, ARetCode 为失败的返回码, 允许为空, 当字符串类型成功时为值尺寸)
long __stdcall RCKGetInt(long Attrib, long* ARetCode);
void* __stdcall RCKGetObj(long Attrib, long* ARetCode);
char* __stdcall RCKGetStr(long Attrib, long* ARetCode);
// 设置接口属性
long __stdcall RCKSetInt(long Attrib, long AValue);
long __stdcall RCKSetObj(long Attrib, void* AValue);
long __stdcall RCKSetStr(long Attrib, const char* AValue, long ASize);
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/* Application 的相关函数 */
// 创建/释放应用
void* __stdcall RCKAppCreate(const char* AName, const char* APassword);
void __stdcall RCKAppFree(void* AppObj);
// 开始/结束应用的函数定义
long __stdcall RCKAppFuncBegin(void* AppObj);
long __stdcall RCKAppFuncEnd(void* AppObj);
// 根据函数名取应用的函数对象
void* __stdcall RCKAppFuncObj(void* AppObj, const char* AName);
// 打开/关闭应用/强制注销应用的连接
long __stdcall RCKAppOpen(void* AppObj);
long __stdcall RCKAppClose(void* AppObj);
long __stdcall RCKAppLogout(void* AppObj, void* AConnObj);
// 取应用属性
// (返回值为属性值, ARetCode 为失败的返回码, 允许为空, 当字符串类型成功时为值尺寸)
long __stdcall RCKAppGetInt(void* AppObj, long Attrib, long* ARetCode);
void* __stdcall RCKAppGetObj(void* AppObj, long Attrib, long* ARetCode);
char* __stdcall RCKAppGetStr(void* AppObj, long Attrib, long* ARetCode);
// 设置应用属性
long __stdcall RCKAppSetInt(void* AppObj, long Attrib, long AValue);
long __stdcall RCKAppSetObj(void* AppObj, long Attrib, void* AValue);
long __stdcall RCKAppSetStr(void* AppObj, long Attrib,
const char* AValue, long ASize);
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/* Function 的相关函数 */
// 创建/释放 Function
void* __stdcall RCKFuncCreate(void* AppObj, long ACallMode, void* ACallback,
const char* AName, long ARetType, long ARetSize);
void __stdcall RCKFuncFree(void* AFuncObj);
// 添加 Function 参数/返回字段
long __stdcall RCKFuncAddParam(void* AFuncObj, const char* AName,
long AType, long ASize, bool AIsRef);
long __stdcall RCKFuncAddField(void* AFuncObj, const char* AName,
long AType, long ASize);
// 取 Function 参数名索引/返回字段名索引
long __stdcall RCKFuncParamIndex(void* AFuncObj, const char* AName);
long __stdcall RCKFuncFieldIndex(void* AFuncObj, const char* AName);
// 取 Function 属性
// (返回值为属性值, ARetCode 为失败的返回码, 允许为空, 当字符串类型成功时为值尺寸)
long __stdcall RCKFuncGetInt(void* AFuncObj, long Attrib, long* ARetCode);
void* __stdcall RCKFuncGetObj(void* AFuncObj, long Attrib, long* ARetCode);
char* __stdcall RCKFuncGetStr(void* AFuncObj, long Attrib, long* ARetCode);
// 设置 Function 属性
long __stdcall RCKFuncSetInt(void* AFuncObj, long Attrib, long AValue);
long __stdcall RCKFuncSetObj(void* AFuncObj, long Attrib, void* AValue);
long __stdcall RCKFuncSetStr(void* AFuncObj, long Attrib,
const char* AValue, long ASize);
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/* Connection 的相关函数 */
// 创建/释放连接(注: ASlotObj 必须非空且唯一, ASlotMethods 必须非空)
void* __stdcall RCKConnCreate(long AType, void* ASlotObj,
const TRCKSlotMethods* ASlotMethods);
void __stdcall RCKConnFree(void* AConnObj);
// 打开/关闭连接
long __stdcall RCKConnOpen(void* AConnObj);
long __stdcall RCKConnClose(void* AConnObj);
// 登录/登出对端应用
long __stdcall RCKConnLogin(void* AConnObj);
long __stdcall RCKConnLogout(void* AConnObj);
// 加载对端应用的函数列表
long __stdcall RCKConnLoad(void* AConnObj);
// 发送数据(参数 ANeedPack 表示数据是否需要压缩发送)
long __stdcall RCKConnSendData(void* AConnObj, const void* AData,
long ASize, bool ANeedPack);
// 取连接属性
// (返回值为属性值, ARetCode 为失败的返回码, 允许为空, 当字符串类型成功时为值尺寸)
long __stdcall RCKConnGetInt(void* AConnObj, long Attrib, long* ARetCode);
void* __stdcall RCKConnGetObj(void* AConnObj, long Attrib, long* ARetCode);
char* __stdcall RCKConnGetStr(void* AConnObj, long Attrib, long* ARetCode);
// 设置连接属性
long __stdcall RCKConnSetInt(void* AConnObj, long Attrib, long AValue);
long __stdcall RCKConnSetObj(void* AConnObj, long Attrib, void* AValue);
long __stdcall RCKConnSetStr(void* AConnObj, long Attrib,
const char* AValue, long ASize);
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/* Command 的相关函数 */
// 创建/释放命令
void* __stdcall RCKCmdCreate();
void __stdcall RCKCmdFree(void* ACmdObj);
// 开始/结束命令
long __stdcall RCKCmdBegin(void* ACmdObj, const char* AName);
long __stdcall RCKCmdEnd(void* ACmdObj);
// 重新开始/执行命令
long __stdcall RCKCmdRestart(void* ACmdObj);
long __stdcall RCKCmdExecute(void* ACmdObj, unsigned long ATimeout);
// 取命令属性
// (返回值为属性值, ARetCode 为失败的返回码, 允许为空, 当字符串类型成功时为值尺寸)
long __stdcall RCKCmdGetInt(void* ACmdObj, long Attrib, long* ARetCode);
void* __stdcall RCKCmdGetObj(void* ACmdObj, long Attrib, long* ARetCode);
char* __stdcall RCKCmdGetStr(void* ACmdObj, long Attrib, long* ARetCode);
// 设置命令属性
long __stdcall RCKCmdSetInt(void* ACmdObj, long Attrib, long AValue);
long __stdcall RCKCmdSetObj(void* ACmdObj, long Attrib, void* AValue);
long __stdcall RCKCmdSetStr(void* ACmdObj, long Attrib,
const char* AValue, long ASize);
// 取当前命令的各类型返回值
// (ARetCode 为失败的返回码, 允许为空, 当字符串或结构类型成功时为值尺寸)
char* __stdcall RCKCmdRetStr(void* ACmdObj, long* ARetCode);
long __stdcall RCKCmdRetInt(void* ACmdObj, long* ARetCode);
bool __stdcall RCKCmdRetBool(void* ACmdObj, long* ARetCode);
double __stdcall RCKCmdRetFloat(void* ACmdObj, long* ARetCode);
void* __stdcall RCKCmdRetStruct(void* ACmdObj, long* ARetCode);
__int64 __stdcall RCKCmdRetInt64(void* ACmdObj, long* ARetCode);
double __stdcall RCKCmdRetDate(void* ACmdObj, long* ARetCode);
long __stdcall RCKCmdRetCustom(void* ACmdObj, void* AValue, long ASize);
// 清除当前命令参数值/取当前命令的参数名索引
long __stdcall RCKCmdParamClear(void* ACmdObj);
long __stdcall RCKCmdParamIndex(void* ACmdObj, const char* AName);
// 根据参数索引设置当前命令的各类型参数值
long __stdcall RCKCmdParamByStr(void* ACmdObj, long AIndex,
const char* AValue, long ASize);
long __stdcall RCKCmdParamByInt(void* ACmdObj, long AIndex, long AValue);
long __stdcall RCKCmdParamByBool(void* ACmdObj, long AIndex, bool AValue);
long __stdcall RCKCmdParamByFloat(void* ACmdObj, long AIndex, double AValue);
long __stdcall RCKCmdParamByStruct(void* ACmdObj, long AIndex, void* AValue);
long __stdcall RCKCmdParamByInt64(void* ACmdObj, long AIndex, __int64 AValue);
long __stdcall RCKCmdParamByDate(void* ACmdObj, long AIndex, double AValue);
long __stdcall RCKCmdParamByCustom(void* ACmdObj, long AIndex,
const void* AValue, long ASize);
// 根据参数名设置当前命令的各类型参数值
long __stdcall RCKCmdParamByStr_(void* ACmdObj, const char* AName,
const char* AValue, long ASize);
long __stdcall RCKCmdParamByInt_(void* ACmdObj, const char* AName, long AValue);
long __stdcall RCKCmdParamByBool_(void* ACmdObj, const char* AName, bool AValue);
long __stdcall RCKCmdParamByFloat_(void* ACmdObj, const char* AName, double AValue);
long __stdcall RCKCmdParamByStruct_(void* ACmdObj, const char* AName, void* AValue);
long __stdcall RCKCmdParamByInt64_(void* ACmdObj, const char* AName, __int64 AValue);
long __stdcall RCKCmdParamByDate_(void* ACmdObj, const char* AName, double AValue);
long __stdcall RCKCmdParamByCustom_(void* ACmdObj, const char* AName,
const void* AValue, long ASize);
// 取当前命令的返回字段名索引/字段值是否为空(ARetCode 为失败的返回码, 允许为空)
long __stdcall RCKCmdFieldIndex(void* ACmdObj, const char* AName);
bool __stdcall RCKCmdFieldIsNull(void* ACmdObj, long AIndex, long* ARetCode);
bool __stdcall RCKCmdFieldIsNull_(void* ACmdObj, const char* AName, long* ARetCode);
// 根据字段索引取当前命令的各类型字段值
// (ARetCode 为失败的返回码, 允许为空, 当字符串或结构类型成功时为值尺寸)
char* __stdcall RCKCmdFieldStr(void* ACmdObj, long AIndex, long* ARetCode);
long __stdcall RCKCmdFieldInt(void* ACmdObj, long AIndex, long* ARetCode);
bool __stdcall RCKCmdFieldBool(void* ACmdObj, long AIndex, long* ARetCode);
double __stdcall RCKCmdFieldFloat(void* ACmdObj, long AIndex, long* ARetCode);
void* __stdcall RCKCmdFieldStruct(void* ACmdObj, long AIndex, long* ARetCode);
__int64 __stdcall RCKCmdFieldInt64(void* ACmdObj, long AIndex, long* ARetCode);
double __stdcall RCKCmdFieldDate(void* ACmdObj, long AIndex, long* ARetCode);
long __stdcall RCKCmdFieldCustom(void* ACmdObj, long AIndex,
void* AValue, long ASize);
// 根据字段名取当前命令的各类型字段值
// (ARetCode 为失败的返回码, 允许为空, 当字符串或结构类型成功时为值尺寸)
char* __stdcall RCKCmdFieldStr_(void* ACmdObj, const char* AName, long* ARetCode);
long __stdcall RCKCmdFieldInt_(void* ACmdObj, const char* AName, long* ARetCode);
bool __stdcall RCKCmdFieldBool_(void* ACmdObj, const char* AName, long* ARetCode);
double __stdcall RCKCmdFieldFloat_(void* ACmdObj, const char* AName, long* ARetCode);
void* __stdcall RCKCmdFieldStruct_(void* ACmdObj, const char* AName, long* ARetCode);
__int64 __stdcall RCKCmdFieldInt64_(void* ACmdObj, const char* AName, long* ARetCode);
double __stdcall RCKCmdFieldDate_(void* ACmdObj, const char* AName, long* ARetCode);
long __stdcall RCKCmdFieldCustom_(void* ACmdObj, const char* AName,
void* AValue, long ASize);
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/* Response 的相关函数 */
// 取应答的连接对象/函数对象/状态
void* __stdcall RCKRespConnObj(void* AResp);
void* __stdcall RCKRespFuncObj(void* AResp);
long __stdcall RCKRespState(void* AResp);
// 取应答的各类型返回值
// (ARetCode 为失败的返回码, 允许为空, 当字符串或结构类型成功时为值尺寸)
char* __stdcall RCKRespRetStr(void* AResp, long* ARetCode);
long __stdcall RCKRespRetInt(void* AResp, long* ARetCode);
bool __stdcall RCKRespRetBool(void* AResp, long* ARetCode);
double __stdcall RCKRespRetFloat(void* AResp, long* ARetCode);
void* __stdcall RCKRespRetStruct(void* AResp, long* ARetCode);
__int64 __stdcall RCKRespRetInt64(void* AResp, long* ARetCode);
double __stdcall RCKRespRetDate(void* AResp, long* ARetCode);
long __stdcall RCKRespRetCustom(void* AResp, void* AValue, long ASize);
// 根据索引取应答的各类型参数值
// (ARetCode 为失败的返回码, 允许为空, 当字符串或结构类型成功时为值尺寸)
char* __stdcall RCKRespParamStr(void* AResp, long AIndex, long* ARetCode);
long __stdcall RCKRespParamInt(void* AResp, long AIndex, long* ARetCode);
bool __stdcall RCKRespParamBool(void* AResp, long AIndex, long* ARetCode);
double __stdcall RCKRespParamFloat(void* AResp, long AIndex, long* ARetCode);
void* __stdcall RCKRespParamStruct(void* AResp, long AIndex, long* ARetCode);
__int64 __stdcall RCKRespParamInt64(void* AResp, long AIndex, long* ARetCode);
double __stdcall RCKRespParamDate(void* AResp, long AIndex, long* ARetCode);
long __stdcall RCKRespParamCustom(void* AResp, long AIndex,
void* AValue, long ASize);
// 根据参数名取应答的各类型参数值
// (ARetCode 为失败的返回码, 允许为空, 当字符串或结构类型成功时为值尺寸)
char* __stdcall RCKRespParamStr_(void* AResp, const char* AName, long* ARetCode);
long __stdcall RCKRespParamInt_(void* AResp, const char* AName, long* ARetCode);
bool __stdcall RCKRespParamBool_(void* AResp, const char* AName, long* ARetCode);
double __stdcall RCKRespParamFloat_(void* AResp, const char* AName, long* ARetCode);
void* __stdcall RCKRespParamStruct_(void* AResp, const char* AName, long* ARetCode);
__int64 __stdcall RCKRespParamInt64_(void* AResp, const char* AName, long* ARetCode);
double __stdcall RCKRespParamDate_(void* AResp, const char* AName, long* ARetCode);
long __stdcall RCKRespParamCustom_(void* AResp, const char* AName,
void* AValue, long ASize);
// 根据索引取应答的各类型字段返回值
// (ARetCode 为失败的返回码, 允许为空, 当字符串或结构类型成功时为值尺寸)
char* __stdcall RCKRespFieldStr(void* AResp, long AIndex, long* ARetCode);
long __stdcall RCKRespFieldInt(void* AResp, long AIndex, long* ARetCode);
bool __stdcall RCKRespFieldBool(void* AResp, long AIndex, long* ARetCode);
double __stdcall RCKRespFieldFloat(void* AResp, long AIndex, long* ARetCode);
void* __stdcall RCKRespFieldStruct(void* AResp, long AIndex, long* ARetCode);
__int64 __stdcall RCKRespFieldInt64(void* AResp, long AIndex, long* ARetCode);
double __stdcall RCKRespFieldDate(void* AResp, long AIndex, long* ARetCode);
long __stdcall RCKRespFieldCustom(void* AResp, long AIndex,
void* AValue, long ASize);
// 根据字段名取应答的各类型字段返回值
// (ARetCode 为失败的返回码, 允许为空, 当字符串或结构类型成功时为值尺寸)
char* __stdcall RCKRespFieldStr_(void* AResp, const char* AName, long* ARetCode);
long __stdcall RCKRespFieldInt_(void* AResp, const char* AName, long* ARetCode);
bool __stdcall RCKRespFieldBool_(void* AResp, const char* AName, long* ARetCode);
double __stdcall RCKRespFieldFloat_(void* AResp, const char* AName, long* ARetCode);
void* __stdcall RCKRespFieldStruct_(void* AResp, const char* AName, long* ARetCode);
__int64 __stdcall RCKRespFieldInt64_(void* AResp, const char* AName, long* ARetCode);
double __stdcall RCKRespFieldDate_(void* AResp, const char* AName, long* ARetCode);
long __stdcall RCKRespFieldCustom_(void* AResp, const char* AName,
void* AValue, long ASize);
// 设置应答的各类型返回值
long __stdcall RCKRespRetByStr(void* AResp, const char* AValue, long ASize);
long __stdcall RCKRespRetByInt(void* AResp, long AValue);
long __stdcall RCKRespRetByBool(void* AResp, bool AValue);
long __stdcall RCKRespRetByFloat(void* AResp, double AValue);
long __stdcall RCKRespRetByStruct(void* AResp, void* AValue);
long __stdcall RCKRespRetByInt64(void* AResp, __int64 AValue);
long __stdcall RCKRespRetByDate(void* AResp, double AValue);
long __stdcall RCKRespRetByCustom(void* AResp, const void* AValue, long ASize);
// 根据索引设置应答的各类型字段返回值
long __stdcall RCKRespFieldByStr(void* AResp, long AIndex,
const char* AValue, long ASize);
long __stdcall RCKRespFieldByInt(void* AResp, long AIndex, long AValue);
long __stdcall RCKRespFieldByBool(void* AResp, long AIndex, bool AValue);
long __stdcall RCKRespFieldByFloat(void* AResp, long AIndex, double AValue);
long __stdcall RCKRespFieldByStruct(void* AResp, long AIndex, void* AValue);
long __stdcall RCKRespFieldByInt64(void* AResp, long AIndex, __int64 AValue);
long __stdcall RCKRespFieldByDate(void* AResp, long AIndex, double AValue);
long __stdcall RCKRespFieldByCustom(void* AResp, long AIndex,
const void* AValue, long ASize);
// 根据字段名设置应答的各类型字段返回值
long __stdcall RCKRespFieldByStr_(void* AResp, const char* AName,
const char* AValue, long ASize);
long __stdcall RCKRespFieldByInt_(void* AResp, const char* AName, long AValue);
long __stdcall RCKRespFieldByBool_(void* AResp, const char* AName, bool AValue);
long __stdcall RCKRespFieldByFloat_(void* AResp, const char* AName, double AValue);
long __stdcall RCKRespFieldByStruct_(void* AResp, const char* AName, void* AValue);
long __stdcall RCKRespFieldByInt64_(void* AResp, const char* AName, __int64 AValue);
long __stdcall RCKRespFieldByDate_(void* AResp, const char* AName, double AValue);
long __stdcall RCKRespFieldByCustom_(void* AResp, const char* AName,
const void* AValue, long ASize);
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/* Fields 的相关函数 */
// 创建/释放字段集
void* __stdcall RCKFieldsCreate();
void __stdcall RCKFieldsFree(void* AFields);
// 添加字段定义/删除指定索引的字段及定义
long __stdcall RCKFieldDefsAdd(void* AFields, const char* AName,
long AType, long ASize);
void __stdcall RCKFieldDefsDelete(void* AFields, long AIndex);
// 清除/拷贝/输出字段定义集/取字段定义集的数据尺寸
void __stdcall RCKFieldDefsClear(void* AFields);
long __stdcall RCKFieldDefsAssign(void* AFields, const void* ADefs, long ASize);
void* __stdcall RCKFieldDefsOutput(void* AFields, long* ARetSize);
long __stdcall RCKFieldDefsSize(const void* AFieldDefs);
// 清除/拷贝/输出字段集的数据/取字段集的数据尺寸
void __stdcall RCKFieldsClear(void* AFields);
long __stdcall RCKFieldsAssign(void* AFields, const void* AData, long ASize);
void* __stdcall RCKFieldsOutput(void* AFields, long* ARetSize);
long __stdcall RCKFieldsSize(void* AFields);
// 取字段个数/取字段名所在索引
long __stdcall RCKFieldCount(void* AFields);
long __stdcall RCKFieldIndex(void* AFields, const char* AName);
// 取索引字段名/类型/定义尺寸/值尺寸
char* __stdcall RCKFieldName(void* AFields, long AIndex);
long __stdcall RCKFieldType(void* AFields, long AIndex);
long __stdcall RCKFieldDefSize(void* AFields, long AIndex);
long __stdcall RCKFieldSize(void* AFields, long AIndex);
// 判断索引字段是否为空(ARetCode 为失败的返回码, 允许为空)
bool __stdcall RCKFieldIsNull(void* AFields, long AIndex, long* ARetCode);
bool __stdcall RCKFieldIsNull_(void* AFields, const char* AName, long* ARetCode);
// 取索引字段的各类型值
// (ARetCode 为失败的返回码, 允许为空, 当字符串或结构类型成功时为值尺寸)
char* __stdcall RCKFieldAsStr(void* AFields, long AIndex, long* ARetCode);
long __stdcall RCKFieldAsInt(void* AFields, long AIndex, long* ARetCode);
bool __stdcall RCKFieldAsBool(void* AFields, long AIndex, long* ARetCode);
double __stdcall RCKFieldAsFloat(void* AFields, long AIndex, long* ARetCode);
void* __stdcall RCKFieldAsStruct(void* AFields, long AIndex, long* ARetCode);
__int64 __stdcall RCKFieldAsInt64(void* AFields, long AIndex, long* ARetCode);
double __stdcall RCKFieldAsDate(void* AFields, long AIndex, long* ARetCode);
long __stdcall RCKFieldGetCustom(void* AFields, long AIndex,
void* AValue, long ASize);
// 取字段名字段的各类型值
// (ARetCode 为失败的返回码, 允许为空, 当字符串或结构类型成功时为值尺寸)
char* __stdcall RCKFieldAsStr_(void* AFields, const char* AName, long* ARetCode);
long __stdcall RCKFieldAsInt_(void* AFields, const char* AName, long* ARetCode);
bool __stdcall RCKFieldAsBool_(void* AFields, const char* AName, long* ARetCode);
double __stdcall RCKFieldAsFloat_(void* AFields, const char* AName, long* ARetCode);
void* __stdcall RCKFieldAsStruct_(void* AFields, const char* AName, long* ARetCode);
__int64 __stdcall RCKFieldAsInt64_(void* AFields, const char* AName, long* ARetCode);
double __stdcall RCKFieldAsDate_(void* AFields, const char* AName, long* ARetCode);
long __stdcall RCKFieldGetCustom_(void* AFields, const char* AName,
void* AValue, long ASize);
// 设置索引字段的类型值
long __stdcall RCKFieldByStr(void* AFields, long AIndex,
const char* AValue, long ASize);
long __stdcall RCKFieldByInt(void* AFields, long AIndex, long AValue);
long __stdcall RCKFieldByBool(void* AFields, long AIndex, bool AValue);
long __stdcall RCKFieldByFloat(void* AFields, long AIndex, double AValue);
long __stdcall RCKFieldByStruct(void* AFields, long AIndex, void* AValue);
long __stdcall RCKFieldByInt64(void* AFields, long AIndex, __int64 AValue);
long __stdcall RCKFieldByDate(void* AFields, long AIndex, double AValue);
long __stdcall RCKFieldSetCustom(void* AFields, long AIndex,
const void* AValue, long ASize);
// 设置字段名字段的类型值
long __stdcall RCKFieldByStr_(void* AFields, const char* AName,
const char* AValue, long ASize);
long __stdcall RCKFieldByInt_(void* AFields, const char* AName, long AValue);
long __stdcall RCKFieldByBool_(void* AFields, const char* AName, bool AValue);
long __stdcall RCKFieldByFloat_(void* AFields, const char* AName, double AValue);
long __stdcall RCKFieldByStruct_(void* AFields, const char* AName, const void* AValue);
long __stdcall RCKFieldByInt64_(void* AFields, const char* AName, __int64 AValue);
long __stdcall RCKFieldByDate_(void* AFields, const char* AName, double AValue);
long __stdcall RCKFieldSetCustom_(void* AFields, const char* AName,
const void* AValue, long ASize);
}
#endif
4. RC 的自环接口定义(注: 内部实现 RCK 通讯槽接口)
自环接口用于进程内通过 Command 调用 Application 函数, 便于输出接口统一。
参见 <RC4SL.h> 文件
// =======================================
// Unit : RC for self-loop
// Version: 4.0.0.0 (build 2013.08.18)
// Author : Kyee Ye
// Email : kyee_ye(at)126.com
// Copyright (C) Kyee workroom
// =======================================
#ifndef _RC4SL_H_
#define _RC4SL_H_
#include "RCKernel.h"
using namespace RCKernel;
#ifdef _WIN64
#pragma comment(lib, "RC4SL64.lib")
#else
#pragma comment(lib, "RC4SL32.lib")
#endif
namespace RC4SL
{
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/* 常量定义 */
// 返回值及错误码
// 见 RCKSlot.h 中的 TRCKResult 定义
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/* 接口相关函数 */
// 接口初始化/释放函数
void __stdcall SLInitialize();
void __stdcall SLUninitialize();
// 接口版本信息, 格式: "x.x.x.x (build yyyy.mm.dd)"
// AVersion 返回版本号, 如: 0x0708090A 表示 7.8.9.10
char* __stdcall SLGetVersion(long* AVersion);
// 取当前操作的最后错误码(注: 用于返回值非错误码的函数)
long __stdcall SLGetLastError();
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/* SL 的相关函数 */
// 创建 SL 连接, 返回 RCKConnCreate 创建的对象
// 注: SL 连接的释放调用 RCKConnFree 即可
void* __stdcall SLCreate();
// 取 SL 连接个数/指定索引的连接对象
long __stdcall SLGetCount();
void* __stdcall SLGetConnObj(long AIndex);
// 断开 SL 连接(注: 用于测试 Slot 的 OnDisconnect 事件)
long __stdcall SLDisconnect(void* ASlotObj);
}
#endif
5. RC 的 TCP 接口定义(注: 内部实现 RCK 通讯槽接口)
参见 <RC4TCP.h> 文件
// =======================================
// Unit : RC for TCP
// Version: 4.0.0.0 (build 2013.09.09)
// Author : Kyee Ye
// Email : kyee_ye(at)126.com
// Copyright (C) Kyee workroom
// =======================================
#ifndef _RC4TCP_H_
#define _RC4TCP_H_
#include "RCKernel.h"
using namespace RCKernel;
#ifdef _WIN64
#pragma comment(lib, "RC4TCP64.lib")
#else
#pragma comment(lib, "RC4TCP32.lib")
#endif
namespace RC4TCP
{
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/* 常量定义 */
// 返回值及错误码
// 见 RCKSlot.h 中的 TRCKResult 定义
// 接口的属性项
enum TTCPAttrib
{taVersion = 0, // 接口版本信息, 格式: "x.x.x.x (build yyyy.mm.dd)"
taServerCount = 1, // TCP 服务端个数
taRecvThreads = 2, // 所有客户端的接收线程最大个数, 默认值: 8
taCacheThreads = 3, // 所有客户端的接收线程缓冲池尺寸, 默认值: 8
taBaseServer = 0x10000}; // 服务端索引基数: 服务端对象
// 服务端的属性项
enum TTCPServerAttrib
{tsaError = 0, // 打开服务失败返回的错误信息
tsaData = 1, // 自定义数据
tsaAddr = 2, // 服务端的绑定IP地址, 默认值: ""
tsaPort = 3, // 服务端的侦听端口号, 默认值: 0
tsaState = 4, // 服务端的状态
tsaLinger = 5, // TCP 句柄关闭后的拖延时长(秒), 默认值: 0
tsaListenQueue = 6, // 服务端的侦听连接队列尺寸, 默认值: 5
tsaRecvThreads = 7, // 接收线程最大个数, 默认值: 8
tsaCacheThreads = 8, // 接收线程缓冲池尺寸, 默认值: 8
tsaMaxClientCount = 9, // 服务端连接的最大客户端个数, 默认值: 0 表示无限制
tsaSrvClientCount = 10, // 当前服务已连接的客户端个数
tsaCanLogin = 11, // 连接是否能够登录对端应用, 默认值: false
tsaCanBindApp = 12, // 连接是否能够绑定应用, 默认值: true
tsaSendMaxSize = 13, // 通讯槽对象的发送整个包最大长度, 默认值: 8192
tsaSendQueueSize = 14, // 连接的 RCKConnSendData 发送队列尺寸, 默认值: 256
tsaTimeout = 15, // 连接的操作超时(单位: 毫秒), 默认值: 30000
tsaKeepTimeout = 16, // 连接的心跳检测超时时间(单位: 毫秒), 默认值: 30000
tsaKeepInterval = 17, // 连接的心跳检测重试间隔(单位: 毫秒), 默认值: 10000
tsaKeepRetryTimes = 18, // 连接的心跳检测重试次数, 默认值: 3
tsaOnListen = 19, // 服务的 OnListen 事件, 打开侦听(TRCKOnObjEvent)
tsaOnDisconnect = 20, // 服务的 OnDisconnect 事件, 断开侦听(TRCKOnObjEvent)
tsaOnAccept = 21, // 服务的 OnAccept 事件, 接受连接(TTCPOnAccept), 可以设置连接属性
tsaOnFreeClt = 22, // 服务的 OnFreeClt 事件, 释放连接(TRCKOnObjEvent)
tsaOnCltConnect = 23, // 连接的 OnCltConnect 事件, 连接成功(TRCKOnObjEvent)
tsaOnCltDisconnect= 24, // 连接的 OnCltDisconnect 事件, 断开连接(TRCKOnObjEvent)
tsaOnCltLogin = 25, // 连接的 OnCltLogin 事件, 登录对端应用(TRCKOnObjEvent)
tsaOnCltLogout = 26, // 连接的 OnCltLogout 事件, 登出对端应用(TRCKOnObjEvent)
tsaOnCltCmdReturn = 27, // 连接的 OnCltCmdReturn 事件, 命令返回(TRCKOnCmdReturn)
tsaOnCltRecvData = 28, // 连接的 OnCltRecvData 事件, 接收数据(TRCKOnRecvData)
tsaBaseSrvClient = 0x10000}; // 已连接的客户端索引基数: 客户端对象
// 服务端的状态
enum TTCPServerState
{tssInactive = 0, // 未打开
tssClosing = 1, // 正在关闭
tssOpening = 2, // 正在打开
tssOpened = 3}; // 已经打开
// 服务端客户连接的属性项(即是连接通讯槽对象的扩展属性项, kcaBaseSlotExt + Attrib)
enum TTCPSrvCltAttrib
{tscaData = 0, // 自定义数据
tscaSrvObj = 1, // 连接的服务端对象
tscaIsValid = 2}; // 连接是否有效
// 客户端的属性项(即是连接通讯槽对象的扩展属性项, kcaBaseSlotExt + Attrib)
enum TTCPClientAttrib
{tcaError = 0, // 打开客户端失败返回的错误信息
tcaData = 1, // 自定义数据
tcaLinger = 2}; // TCP 句柄关闭后的拖延时长(秒), 默认值: 0
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/* 接口回调函数类型定义 */
// 服务端接受连接事件的回调函数类型(OnAccept)
typedef void (__stdcall *TTCPOnAccept)(void* ASrvObj, void* AConnObj, bool& AIsRefused);
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/* 接口相关函数 */
// 接口初始化/释放函数
void __stdcall TCPInitialize();
void __stdcall TCPUninitialize();
// 接口版本信息, 格式: "x.x.x.x (build yyyy.mm.dd)"
// AVersion 返回版本号, 如: 0x0708090A 表示 7.8.9.10
char* __stdcall TCPGetVersion(long* AVersion);
// 取当前操作的最后错误码(注: 用于返回值非错误码的函数)
long __stdcall TCPGetLastError();
// 取接口属性
// (返回值为属性值, ARetCode 为失败的返回码, 允许为空, 当字符串类型成功时为值尺寸)
long __stdcall TCPGetInt(long Attrib, long* ARetCode);
void* __stdcall TCPGetObj(long Attrib, long* ARetCode);
char* __stdcall TCPGetStr(long Attrib, long* ARetCode);
// 设置接口属性
long __stdcall TCPSetInt(long Attrib, long AValue);
long __stdcall TCPSetObj(long Attrib, void* AValue);
long __stdcall TCPSetStr(long Attrib, const char* AValue, long ASize);
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/* TCP 服务端的相关函数 */
// 创建/释放 TCP 服务端
void* __stdcall TCPServerCreate();
void __stdcall TCPServerFree(void* ASrvObj);
// 打开/关闭 TCP 服务端
long __stdcall TCPServerOpen(void* ASrvObj);
long __stdcall TCPServerClose(void* ASrvObj);
// 取 TCP 服务端属性
// (返回值为属性值, ARetCode 为失败的返回码, 允许为空, 当字符串类型成功时为值尺寸)
long __stdcall TCPServerGetInt(void* ASrvObj, long Attrib, long* ARetCode);
void* __stdcall TCPServerGetObj(void* ASrvObj, long Attrib, long* ARetCode);
char* __stdcall TCPServerGetStr(void* ASrvObj, long Attrib, long* ARetCode);
// 设置 TCP 服务端属性
long __stdcall TCPServerSetInt(void* ASrvObj, long Attrib, long AValue);
long __stdcall TCPServerSetObj(void* ASrvObj, long Attrib, void* AValue);
long __stdcall TCPServerSetStr(void* ASrvObj, long Attrib,
const char* AValue, long ASize);
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/* TCP 客户端的相关函数 */
// 创建 TCP 客户端, 返回 RCKConnCreate 创建的对象
// 注: TCP 客户端的释放调用 RCKConnFree 即可
// TCP 客户端的属性是连接通讯槽对象的扩展属性项, kcaBaseSlotExt + Attrib
void* __stdcall TCPClientCreate();
}
#endif
--------------------------------------------------------------------------------
浙公网安备 33010602011771号