/********************************************************************* *文件说明: 通过收发消息模式调用接口 *作者: logos *日期: 2017/06/18 *修改日志: 2017/06/18 logos 创建 2018/11/01 logos 修改成skts模式 -- 可以支持本地接口转换 ***********************************************************************/ #pragma once #ifndef _DLL_INCLUDE_NETCALL_H #define _DLL_INCLUDE_NETCALL_H #ifndef EXPORT_C #define EXPORT_C extern "C" #endif #ifndef WINAPI #define WINAPI __stdcall #endif #ifndef ushort #define ushort unsigned short #endif typedef class CNetSocket* NetHandle; //网络接口句柄 typedef class CNetFun* NetFun; //网络函数句柄 //回调函数原型,注册消息接口时按此原型声明函数 /*Intput: hf 调用句柄 funName 函数名称 lparam 回调附加参数 *Return: 成功返回0,失败返回错误码 回调函数内部,必须先把所有入参取出,再调用本地接口 再压入返回值和出参,否则存储顺序可能出错. PS: 阻塞时间不能超过500ms。*/ typedef int (WINAPI *NETFUN)(NetFun hf, const char* funName, void* lparam); //代理网络接口回调函数原型,注册函数回调接口时按此原型声明函数 /* Intput: hf 网络函数句柄 *Return: 成功返回0,失败返回错误码 1. 调用netcall_pop_param按顺序获取调用参数 2. 调用本地对应接口 3. 调用netcall_push_param按顺序压入函数返回值 4. return 0; 除非参数获取或者网络错误,否则都应该返回0成功 PS: 函数内部不能有阻塞操作 */ typedef int (WINAPI *NetCallFun)(NetFun hf); /**************************************************** *Function: 创建一个网络接口句柄 *Intput: pszip 服务器IP port 服务器端口 bclient 是否为客户端 0服务端,1客户端 timeout 超时时间 默认为-1,无限等待 *Output: NULL *Return: 成功返回NetHandle句柄,失败返回NULL *PS: 创建成功后会启动一个线程 ******************************************************/ EXPORT_C NetHandle WINAPI create_netcall(const char* pszip, ushort port, int bclient = 0, int timeout = -1); /**************************************************** *Function: 创建一个网络接口句柄 -- 使用skt句柄创建 *Intput: skt 句柄 timeout 超时时间 默认为-1,无限等待 *Output: NULL *Return: 成功返回NetHandle句柄,失败返回NULL *PS: 创建成功后会启动一个线程 ******************************************************/ EXPORT_C NetHandle WINAPI create_netcall_skt(int skt, int timeout = -1); /**************************************************** *Function: 释放一个网络接口句柄 *Intput: hNet 网络接口句柄 *Output: NULL *Return: 成功返回0,失败返回错误码 *PS: 线程将会被销毁 ******************************************************/ EXPORT_C int WINAPI release_netcall(NetHandle hNet); /**************************************************** *Function: 获取网络接口句柄连接状态 *Intput: hNet 网络接口句柄 *Output: NULL *Return: 连接ok返回1,未连接返回0 ******************************************************/ EXPORT_C int WINAPI netcall_is_connected(NetHandle hNet); /**************************************************** *Function: 快速调用一个网络接口,支持6个以下参数接口 返回值根据返回的网络句柄获取 *Intput: hNet 网络接口句柄 funName 接口名称,远端必须支持 param1~param6 参数地址,可以选填,必须顺序填入 len1~len6 参数长度 *Output: NULL *Return: 成功返回网络函数句柄,失败返回NULL ******************************************************/ EXPORT_C NetFun WINAPI net_call( NetHandle hNet, const char* funName, const void* param1 = 0, unsigned int len1 = 0, const void* param2 = 0, unsigned int len2 = 0, const void* param3 = 0, unsigned int len3 = 0, const void* param4 = 0, unsigned int len4 = 0, const void* param5 = 0, unsigned int len5 = 0, const void* param6 = 0, unsigned int len6 = 0); /**************************************************** *Function: 申请一个网络函数句柄 *Intput: hNet 网络接口句柄 funName 接口名称 *Output: NULL *Return: 成功返回网络函数句柄,失败返回NULL *PS: 调用方和被调用方都可以使用,比如说回调函数,那么被调用方就会 反向调用网络端接口 ******************************************************/ EXPORT_C NetFun WINAPI malloc_netcall(NetHandle hNet, const char* funName); /**************************************************** *Function: 注册接收由网络句柄调用接口 *Intput: hNet 网络接口句柄 fun 回掉函数 param 回掉函数附加参数 *Output: NULL *Return: 成功返回0,失败返回错误码,每个skts只能注册一次 *PS:网络端收到调用指令会自动回掉注册接口, 回调接口内部填充返回值即可 回调接口中不可以释放网络函数句柄,否则会引发崩溃 ******************************************************/ EXPORT_C int WINAPI regist_netcall_fun(NetHandle hNet, NETFUN fun, void* param); /**************************************************** *Function: 释放一个网络函数句柄,每次调用后需要手动释放 *Intput: hf 网络函数句柄 *Output: NULL *Return: 成功返回0,失败返回错误码 *PS: malloc_netcall / net_call 两个调用接口 都会返回网络函数句柄,调用完需要手动释放 最多64个句柄,如果不释放,后面再次调用会阻塞 若超过64个阻塞接口,那么后面再次调用也会阻塞 ******************************************************/ EXPORT_C int WINAPI free_netcall(NetFun hf); /**************************************************** *Function: 通过网络函数句柄获取网络接口句柄 *Intput: hf 网络函数句柄 *Output: NULL *Return: 成功返回NetHandle句柄,失败返回NULL ******************************************************/ EXPORT_C NetHandle WINAPI get_netcall(NetFun hf); /**************************************************** *Function: 执行网络调用接口,首先申请网络句柄,然后顺序压入参数, 再调用本接口,可兼容任意复杂函数接口 *Intput: hf 网络函数句柄 *Output: NULL *Return: 成功返回0,失败返回错误代码 ******************************************************/ EXPORT_C int WINAPI net_call_run(NetFun hf); /**************************************************** *Function: 最多一次压入6个参数到网络句柄,为调用做准备 *Intput: hf 网络函数句柄 param1~param6 参数地址,可以选填,必须顺序填入 len1~len6 参数长度 *Output: NULL *Return: 成功返回0,失败返回错误码 *PS: 压入参数时,遇到参数为0则结束 总消息长度最大 40k ******************************************************/ EXPORT_C int WINAPI netcall_push_param(NetFun hf, const void* param1 = 0, unsigned int len1 = 0, const void* param2 = 0, unsigned int len2 = 0, const void* param3 = 0, unsigned int len3 = 0, const void* param4 = 0, unsigned int len4 = 0, const void* param5 = 0, unsigned int len5 = 0, const void* param6 = 0, unsigned int len6 = 0); /**************************************************** *Function: 最多一次压入6个字符串参数到网络句柄,为调用做准备 必须是连续字符串参数,否则需要重复压入 *Intput: hf 网络函数句柄 param1~param6 结果地址,可以选填,必须顺序填入 *Output: NULL *Return: 成功返回0,失败返回错误码 *PS: 获取结果时,遇到参数为0则结束 总消息长度最大 40k ******************************************************/ EXPORT_C int WINAPI netcall_push_string(NetFun hf, const char* param1 = 0, const char* param2 = 0, const char* param3 = 0, const char* param4 = 0, const char* param5 = 0, const char* param6 = 0); /**************************************************** *Function: 最多一次从网络句柄顺序获取6个结果 *Intput: hf 网络函数句柄 param1~param6 结果地址,可以选填,必须顺序填入 len1~len6 结果最大长度 *Output: NULL *Return: 成功返回0,失败返回错误码 *PS: 获取结果时,遇到参数为0则结束 ******************************************************/ EXPORT_C int WINAPI netcall_pop_param(NetFun hf, void* param1 = 0, unsigned int len1 = 0, void* param2 = 0, unsigned int len2 = 0, void* param3 = 0, unsigned int len3 = 0, void* param4 = 0, unsigned int len4 = 0, void* param5 = 0, unsigned int len5 = 0, void* param6 = 0, unsigned int len6 = 0); /**************************************************** *Function: 最多一次从网络句柄顺序获取6个字符串结果, 必须是连续字符串参数,否则需要重复获取 *Intput: hf 网络函数句柄 param1~param6 结果地址,可以选填,必须顺序填入 *Output: NULL *Return: 成功返回0,失败返回错误码 *PS: 获取结果时,遇到参数为0则结束 单个字符串超过256字节,不能用此方式获取 ******************************************************/ EXPORT_C int WINAPI netcall_pop_string(NetFun hf, char* param1 = 0, char* param2 = 0, char* param3 = 0, char* param4 = 0, char* param5 = 0, char* param6 = 0); /**************************************************** *Function: 获取hf句柄当前参数大小 *Intput: hf 网络函数句柄 *Output: NULL *Return: 成功返回当前待取参数所占内存,失败返回错误码 ******************************************************/ EXPORT_C int WINAPI netcall_get_cur_param_size(NetFun hf); /**************************************************** *Function: 获取hf句柄所有参数大小 *Intput: hf 网络函数句柄 *Output: NULL *Return: 成功返回参数所占内存,失败返回错误码 ******************************************************/ EXPORT_C int WINAPI netcall_get_param_size(NetFun hf); /**************************************************** *Function: 获取hf句柄参数个数 *Intput: hf 网络函数句柄 *Output: NULL *Return: 成功返回参数个数,失败返回错误码 ******************************************************/ EXPORT_C int WINAPI netcall_get_param_count(NetFun hf); #ifndef MAX_NAME_LEN #define MAX_NAME_LEN 32 #endif #ifndef MAX_IP_LEN #define MAX_IP_LEN 16 #endif enum Proxy_ErrCode {//错误代码 ERR_NO_SUPPORT_FUN = -1200, //不支持该接口 }; struct TRemoteInfo {//远程客户端信息 char ip[MAX_IP_LEN]; ushort port; }; struct TProxy {//代理服务器信息 char desc[MAX_NAME_LEN]; //代理服务端描述 char ip[MAX_IP_LEN]; //IP地址 ushort port; //端口 ushort tiemout; //超时 单位ms }; /**************************************************** *Function: 初始化远程代理模块 *Intput: NULL *Output: NULL *Return: 成功返回0 ,失败返回错误码 *PS:代理模块接收远程调用消息,并发广播包通知客户端 ******************************************************/ EXPORT_C int WINAPI proxy_init(); /**************************************************** *Function: 释放远程代理模块 *Intput: NULL *Output: NULL *Return: 成功返回0 ,失败返回错误码 ******************************************************/ EXPORT_C int WINAPI proxy_deinit(); /**************************************************** *Function: 设置代理服务端信息 *Intput: pinfo 服务器信息 *Output: NULL *Return: 成功返回0 ,失败返回错误码 ******************************************************/ EXPORT_C int WINAPI proxy_set_info(TProxy* pinfo); /**************************************************** *Function: 获取代理服务端信息 -- 可以获取部分 *Intput: pinfo 服务器信息 *Output: NULL *Return: 成功返回0,失败返回错误码 ******************************************************/ EXPORT_C int WINAPI proxy_get_info(TProxy* pinfo); /**************************************************** *Function: 注册网络接口被调用时的回调函数地址 *Intput: funname 函数名 fun 函数地址 *Output: NULL *Return: 成功返回0,失败返回错误码 *PS: 必须在调用proxy_init之前注册远程接口,初始化以后无法注册 ******************************************************/ EXPORT_C int WINAPI proxy_regist_fun(const char* funname, NetCallFun fun); /**************************************************** *Function: 获取已连接客户端列表 -- 可能为0 *Intput: nsize 缓冲区个数 *Output: plist 数组指针,由内部申请内存,外部直接释放即可 *Return: 返回客户端数量 ******************************************************/ EXPORT_C int WINAPI get_connected_list(TRemoteInfo* plist = 0, int nsize = 0); /**************************************************** *Function: 断开某个客户端IP的连接,并设置该IP为黑名单 *Intput: pszip 客户端IP地址 *Output: NULL *Return: 成功返回0,失败返回错误码 *PS: 单次有效,重启后自动清空 ******************************************************/ EXPORT_C int WINAPI proxy_disconnect(const char* pszip); #endif