You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

331 lines
12 KiB
C

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

/*********************************************************************
*文件说明: 通过收发消息模式调用接口
*作者: 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