2025-05-03 20:57:22 +08:00
/*
* Copyright : JessMA Open Source ( ldcsaa @ gmail . com )
*
* Author : Bruce Liang
* Website : https : //github.com/ldcsaa
* Project : https : //github.com/ldcsaa/HP-Socket
* Blog : http : //www.cnblogs.com/ldcsaa
* Wiki : http : //www.oschina.net/p/hp-socket
* QQ Group : 44636872 , 75375912
*
* Licensed under the Apache License , Version 2.0 ( the " License " ) ;
* you may not use this file except in compliance with the License .
* You may obtain a copy of the License at
*
* http : //www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing , software
* distributed under the License is distributed on an " AS IS " BASIS ,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND , either express or implied .
* See the License for the specific language governing permissions and
* limitations under the License .
*/
2025-10-15 04:32:59 +08:00
2025-05-03 20:57:22 +08:00
# pragma once
# include <winsock2.h>
# include "HPTypeDef.h"
/*****************************************************************************************************************************************************/
/***************************************************************** TCP/UDP Interfaces ****************************************************************/
/*****************************************************************************************************************************************************/
/************************************************************************
名 称 : 双 接 口 模 版 类
描 述 : 定 义 双 接 口 转 换 方 法
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
# if FALSE
# define __DUAL_VPTR_GAP__ sizeof(PVOID)
class __IFakeDualInterface__
{
public :
2025-10-15 04:32:59 +08:00
virtual ~ __IFakeDualInterface__ ( ) { }
2025-05-03 20:57:22 +08:00
} ;
template < class F , class S > class DualInterface : public F , private __IFakeDualInterface__ , public S
# else
# define __DUAL_VPTR_GAP__ 0
template < class F , class S > class DualInterface : public F , public S
# endif
{
public :
2025-10-15 04:32:59 +08:00
/* this 转换为 F* */
inline static F * ToF ( DualInterface * pThis )
{
return ( F * ) ( pThis ) ;
}
/* F* 转换为 this */
inline static DualInterface * FromF ( F * pF )
{
return ( DualInterface * ) ( pF ) ;
}
/* this 转换为 S* */
inline static S * ToS ( DualInterface * pThis )
{
return ( S * ) ( F2S ( ToF ( pThis ) ) ) ;
}
/* S* 转换为 this */
inline static DualInterface * FromS ( S * pS )
{
return FromF ( S2F ( pS ) ) ;
}
/* S* 转换为 F* */
inline static F * S2F ( S * pS )
{
return ( F * ) ( ( char * ) pS - ( sizeof ( F ) + __DUAL_VPTR_GAP__ ) ) ;
}
/* F* 转换为 S* */
inline static S * F2S ( F * pF )
{
return ( S * ) ( ( char * ) pF + ( sizeof ( F ) + __DUAL_VPTR_GAP__ ) ) ;
}
public :
virtual ~ DualInterface ( ) { }
2025-05-03 20:57:22 +08:00
} ;
/************************************************************************
名 称 : 复 合 Socket 组 件 接 口
描 述 : 定 义 复 合 Socket 组 件 的 所 有 操 作 方 法 和 属 性 访 问 方 法 , 复 合 Socket 组 件 同 时 管 理 多 个 Socket 连 接
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
class IComplexSocket
{
public :
2025-10-15 04:32:59 +08:00
/***********************************************************************/
/***************************** 组件操作方法 *****************************/
/*
* 名 称 : 关 闭 通 信 组 件
* 描 述 : 关 闭 通 信 组 件 , 关 闭 完 成 后 断 开 所 有 连 接 并 释 放 所 有 资 源
*
* 参 数 :
* 返 回 值 : TRUE - - 成 功
* FALSE - - 失 败 , 可 通 过 GetLastError ( ) 获 取 错 误 代 码
*/
virtual BOOL Stop ( ) = 0 ;
/*
* 名 称 : 发 送 数 据
* 描 述 : 向 指 定 连 接 发 送 数 据
*
* 参 数 : dwConnID - - 连 接 ID
* pBuffer - - 发 送 缓 冲 区
* iLength - - 发 送 缓 冲 区 长 度
* iOffset - - 发 送 缓 冲 区 指 针 偏 移 量
* 返 回 值 : TRUE - - 成 功
* FALSE - - 失 败 , 可 通 过 SYS_GetLastError ( ) 获 取 错 误 代 码
*/
virtual BOOL Send ( CONNID dwConnID , const BYTE * pBuffer , int iLength , int iOffset = 0 ) = 0 ;
/*
* 名 称 : 发 送 多 组 数 据
* 描 述 : 向 指 定 连 接 发 送 多 组 数 据
* TCP - 顺 序 发 送 所 有 数 据 包
* UDP - 把 所 有 数 据 包 组 合 成 一 个 数 据 包 发 送 ( 数 据 包 的 总 长 度 不 能 大 于 设 置 的 UDP 包 最 大 长 度 )
*
* 参 数 : dwConnID - - 连 接 ID
* pBuffers - - 发 送 缓 冲 区 数 组
* iCount - - 发 送 缓 冲 区 数 目
* 返 回 值 : TRUE - - 成 功
* FALSE - - 失 败 , 可 通 过 SYS_GetLastError ( ) 获 取 错 误 代 码
*/
virtual BOOL SendPackets ( CONNID dwConnID , const WSABUF pBuffers [ ] , int iCount ) = 0 ;
/*
* 名 称 : 暂 停 / 恢 复 接 收
* 描 述 : 暂 停 / 恢 复 某 个 连 接 的 数 据 接 收 工 作
*
* 参 数 : dwConnID - - 连 接 ID
* bPause - - TRUE - 暂 停 , FALSE - 恢 复
* 返 回 值 : TRUE - - 成 功
* FALSE - - 失 败
*/
virtual BOOL PauseReceive ( CONNID dwConnID , BOOL bPause = TRUE ) = 0 ;
/*
* 名 称 : 断 开 连 接
* 描 述 : 断 开 某 个 连 接
*
* 参 数 : dwConnID - - 连 接 ID
* bForce - - 是 否 强 制 断 开 连 接
* 返 回 值 : TRUE - - 成 功
* FALSE - - 失 败
*/
virtual BOOL Disconnect ( CONNID dwConnID , BOOL bForce = TRUE ) = 0 ;
/*
* 名 称 : 断 开 超 时 连 接
* 描 述 : 断 开 超 过 指 定 时 长 的 连 接
*
* 参 数 : dwPeriod - - 时 长 ( 毫 秒 )
* bForce - - 是 否 强 制 断 开 连 接
* 返 回 值 : TRUE - - 成 功
* FALSE - - 失 败
*/
virtual BOOL DisconnectLongConnections ( DWORD dwPeriod , BOOL bForce = TRUE ) = 0 ;
/*
* 名 称 : 断 开 静 默 连 接
* 描 述 : 断 开 超 过 指 定 时 长 的 静 默 连 接
*
* 参 数 : dwPeriod - - 时 长 ( 毫 秒 )
* bForce - - 是 否 强 制 断 开 连 接
* 返 回 值 : TRUE - - 成 功
* FALSE - - 失 败
*/
virtual BOOL DisconnectSilenceConnections ( DWORD dwPeriod , BOOL bForce = TRUE ) = 0 ;
/*
* 名 称 : 等 待
* 描 述 : 等 待 通 信 组 件 停 止 运 行
*
* 参 数 : dwMilliseconds - - 超 时 时 间 ( 毫 秒 , 默 认 : - 1 , 永 不 超 时 )
* 返 回 值 : TRUE - - 成 功
* FALSE - - 失 败 , 可 通 过 SYS_GetLastError ( ) 获 取 错 误 代 码
*/
virtual BOOL Wait ( DWORD dwMilliseconds = INFINITE ) = 0 ;
public :
/***********************************************************************/
/***************************** 属性访问方法 *****************************/
/*
* 名 称 : 设 置 连 接 的 附 加 数 据
* 描 述 : 是 否 为 连 接 绑 定 附 加 数 据 或 者 绑 定 什 么 样 的 数 据 , 均 由 应 用 程 序 自 身 决 定
*
* 参 数 : dwConnID - - 连 接 ID
* pv - - 数 据
* 返 回 值 : TRUE - - 成 功
* FALSE - - 失 败 ( 无 效 的 连 接 ID )
*/
virtual BOOL SetConnectionExtra ( CONNID dwConnID , PVOID pExtra ) = 0 ;
/*
* 名 称 : 获 取 连 接 的 附 加 数 据
* 描 述 : 是 否 为 连 接 绑 定 附 加 数 据 或 者 绑 定 什 么 样 的 数 据 , 均 由 应 用 程 序 自 身 决 定
*
* 参 数 : dwConnID - - 连 接 ID
* ppv - - 数 据 指 针
* 返 回 值 : TRUE - - 成 功
* FALSE - - 失 败 ( 无 效 的 连 接 ID )
*/
virtual BOOL GetConnectionExtra ( CONNID dwConnID , PVOID * ppExtra ) = 0 ;
/* 检测是否为安全连接( SSL/HTTPS) */
virtual BOOL IsSecure ( ) = 0 ;
/* 检查通信组件是否已启动 */
virtual BOOL HasStarted ( ) = 0 ;
/* 查看通信组件当前状态 */
virtual EnServiceState GetState ( ) = 0 ;
/* 获取连接数 */
virtual DWORD GetConnectionCount ( ) = 0 ;
/* 获取所有连接的 CONNID */
virtual BOOL GetAllConnectionIDs ( CONNID pIDs [ ] , DWORD & dwCount ) = 0 ;
/* 获取某个连接时长(毫秒) */
virtual BOOL GetConnectPeriod ( CONNID dwConnID , DWORD & dwPeriod ) = 0 ;
/* 获取某个连接静默时间(毫秒) */
virtual BOOL GetSilencePeriod ( CONNID dwConnID , DWORD & dwPeriod ) = 0 ;
/* 获取某个连接的本地地址信息 */
virtual BOOL GetLocalAddress ( CONNID dwConnID , TCHAR lpszAddress [ ] , int & iAddressLen , USHORT & usPort ) = 0 ;
/* 获取某个连接的远程地址信息 */
virtual BOOL GetRemoteAddress ( CONNID dwConnID , TCHAR lpszAddress [ ] , int & iAddressLen , USHORT & usPort ) = 0 ;
/* 获取最近一次失败操作的错误代码 */
virtual EnSocketError GetLastError ( ) = 0 ;
/* 获取最近一次失败操作的错误描述 */
virtual LPCTSTR GetLastErrorDesc ( ) = 0 ;
/* 获取连接中未发出数据的长度 */
virtual BOOL GetPendingDataLength ( CONNID dwConnID , int & iPending ) = 0 ;
/* 获取连接的数据接收状态 */
virtual BOOL IsPauseReceive ( CONNID dwConnID , BOOL & bPaused ) = 0 ;
/* 检测是否有效连接 */
virtual BOOL IsConnected ( CONNID dwConnID ) = 0 ;
/* 设置地址重用选项 */
virtual void SetReuseAddressPolicy ( EnReuseAddressPolicy enReusePolicy ) = 0 ;
/* 设置数据发送策略 */
virtual void SetSendPolicy ( EnSendPolicy enSendPolicy ) = 0 ;
/* 设置 OnSend 事件同步策略( 默认: OSSP_NONE, 不同步) */
virtual void SetOnSendSyncPolicy ( EnOnSendSyncPolicy enSyncPolicy ) = 0 ;
/* 设置最大连接数(组件会根据设置值预分配内存,因此需要根据实际情况设置,不宜过大)*/
virtual void SetMaxConnectionCount ( DWORD dwMaxConnectionCount ) = 0 ;
/* 设置 Socket 缓存对象锁定时间(毫秒,在锁定期间该 Socket 缓存对象不能被获取使用) */
virtual void SetFreeSocketObjLockTime ( DWORD dwFreeSocketObjLockTime ) = 0 ;
/* 设置 Socket 缓存池大小(通常设置为平均并发连接数的 1/3 - 1/2) */
virtual void SetFreeSocketObjPool ( DWORD dwFreeSocketObjPool ) = 0 ;
/* 设置内存块缓存池大小(通常设置为 Socket 缓存池大小的 2 - 3 倍) */
virtual void SetFreeBufferObjPool ( DWORD dwFreeBufferObjPool ) = 0 ;
/* 设置 Socket 缓存池回收阀值(通常设置为 Socket 缓存池大小的 3 倍) */
virtual void SetFreeSocketObjHold ( DWORD dwFreeSocketObjHold ) = 0 ;
/* 设置内存块缓存池回收阀值 */
virtual void SetFreeBufferObjHold ( DWORD dwFreeBufferObjHold ) = 0 ;
/* 设置工作线程数量(通常设置为 2 * CPU + 2) */
virtual void SetWorkerThreadCount ( DWORD dwWorkerThreadCount ) = 0 ;
/* 设置是否标记静默时间(设置为 TRUE 时 DisconnectSilenceConnections() 和 GetSilencePeriod() 才有效, 默认: TRUE) */
virtual void SetMarkSilence ( BOOL bMarkSilence ) = 0 ;
/* 获取地址重用选项 */
virtual EnReuseAddressPolicy GetReuseAddressPolicy ( ) = 0 ;
/* 获取数据发送策略 */
virtual EnSendPolicy GetSendPolicy ( ) = 0 ;
/* 获取 OnSend 事件同步策略 */
virtual EnOnSendSyncPolicy GetOnSendSyncPolicy ( ) = 0 ;
/* 获取最大连接数 */
virtual DWORD GetMaxConnectionCount ( ) = 0 ;
/* 获取 Socket 缓存对象锁定时间 */
virtual DWORD GetFreeSocketObjLockTime ( ) = 0 ;
/* 获取 Socket 缓存池大小 */
virtual DWORD GetFreeSocketObjPool ( ) = 0 ;
/* 获取内存块缓存池大小 */
virtual DWORD GetFreeBufferObjPool ( ) = 0 ;
/* 获取 Socket 缓存池回收阀值 */
virtual DWORD GetFreeSocketObjHold ( ) = 0 ;
/* 获取内存块缓存池回收阀值 */
virtual DWORD GetFreeBufferObjHold ( ) = 0 ;
/* 获取工作线程数量 */
virtual DWORD GetWorkerThreadCount ( ) = 0 ;
/* 检测是否标记静默时间 */
virtual BOOL IsMarkSilence ( ) = 0 ;
public :
virtual ~ IComplexSocket ( ) { }
2025-05-03 20:57:22 +08:00
} ;
/************************************************************************
名 称 : 通 信 服 务 端 组 件 接 口
描 述 : 定 义 通 信 服 务 端 组 件 的 所 有 操 作 方 法 和 属 性 访 问 方 法
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
class IServer : public IComplexSocket
{
public :
2025-10-15 04:32:59 +08:00
/***********************************************************************/
/***************************** 组件操作方法 *****************************/
2025-05-03 20:57:22 +08:00
2025-10-15 04:32:59 +08:00
/*
* 名 称 : 启 动 通 信 组 件
* 描 述 : 启 动 服 务 端 通 信 组 件 , 启 动 完 成 后 可 开 始 接 收 客 户 端 连 接 并 收 发 数 据
*
* 参 数 : lpszBindAddress - - 监 听 地 址
* usPort - - 监 听 端 口
* 返 回 值 : TRUE - - 成 功
* FALSE - - 失 败 , 可 通 过 GetLastError ( ) 获 取 错 误 代 码
*/
virtual BOOL Start ( LPCTSTR lpszBindAddress , USHORT usPort ) = 0 ;
2025-05-03 20:57:22 +08:00
public :
2025-10-15 04:32:59 +08:00
/***********************************************************************/
/***************************** 属性访问方法 *****************************/
2025-05-03 20:57:22 +08:00
2025-10-15 04:32:59 +08:00
/* 获取监听 Socket 的地址信息 */
virtual BOOL GetListenAddress ( TCHAR lpszAddress [ ] , int & iAddressLen , USHORT & usPort ) = 0 ;
2025-05-03 20:57:22 +08:00
} ;
/************************************************************************
名 称 : TCP 通 信 服 务 端 组 件 接 口
描 述 : 定 义 TCP 通 信 服 务 端 组 件 的 所 有 操 作 方 法 和 属 性 访 问 方 法
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
class ITcpServer : public IServer
{
public :
2025-10-15 04:32:59 +08:00
/***********************************************************************/
/***************************** 组件操作方法 *****************************/
2025-05-03 20:57:22 +08:00
2025-10-15 04:32:59 +08:00
/*
* 名 称 : 发 送 小 文 件
* 描 述 : 向 指 定 连 接 发 送 4096 KB 以 下 的 小 文 件
*
* 参 数 : dwConnID - - 连 接 ID
* lpszFileName - - 文 件 路 径
* pHead - - 头 部 附 加 数 据
* pTail - - 尾 部 附 加 数 据
* 返 回 值 : TRUE - - 成 功
* FALSE - - 失 败 , 可 通 过 SYS_GetLastError ( ) 获 取 错 误 代 码
*/
virtual BOOL SendSmallFile ( CONNID dwConnID , LPCTSTR lpszFileName , const LPWSABUF pHead = nullptr , const LPWSABUF pTail = nullptr ) = 0 ;
2025-05-03 20:57:22 +08:00
# ifdef _SSL_SUPPORT
2025-10-15 04:32:59 +08:00
/*
* 名 称 : 初 始 化 通 信 组 件 SSL 环 境 参 数
* 描 述 : SSL 环 境 参 数 必 须 在 SSL 通 信 组 件 启 动 前 完 成 初 始 化 , 否 则 启 动 失 败
*
* 参 数 : iVerifyMode - - SSL 验 证 模 式 ( 参 考 EnSSLVerifyMode )
* lpszPemCertFile - - 证 书 文 件
* lpszPemKeyFile - - 私 钥 文 件
* lpszKeyPassword - - 私 钥 密 码 ( 没 有 密 码 则 为 空 )
* lpszCAPemCertFileOrPath - - CA 证 书 文 件 或 目 录 ( 单 向 验 证 或 客 户 端 可 选 )
* fnServerNameCallback - - SNI 回 调 函 数 指 针 ( 可 选 , 如 果 为 nullptr 则 使 用 SNI 默 认 回 调 函 数 )
*
* 返 回 值 : TRUE - - 成 功
* FALSE - - 失 败 , 可 通 过 SYS_GetLastError ( ) 获 取 失 败 原 因
*/
virtual BOOL SetupSSLContext ( int iVerifyMode = SSL_VM_NONE , LPCTSTR lpszPemCertFile = nullptr , LPCTSTR lpszPemKeyFile = nullptr , LPCTSTR lpszKeyPassword = nullptr , LPCTSTR lpszCAPemCertFileOrPath = nullptr , Fn_SNI_ServerNameCallback fnServerNameCallback = nullptr ) = 0 ;
/*
* 名 称 : 初 始 化 通 信 组 件 SSL 环 境 参 数 ( 通 过 内 存 加 载 证 书 )
* 描 述 : SSL 环 境 参 数 必 须 在 SSL 通 信 组 件 启 动 前 完 成 初 始 化 , 否 则 启 动 失 败
*
* 参 数 : iVerifyMode - - SSL 验 证 模 式 ( 参 考 EnSSLVerifyMode )
* lpszPemCert - - 证 书 内 容
* lpszPemKey - - 私 钥 内 容
* lpszKeyPassword - - 私 钥 密 码 ( 没 有 密 码 则 为 空 )
* lpszCAPemCert - - CA 证 书 内 容 ( 单 向 验 证 或 客 户 端 可 选 )
* fnServerNameCallback - - SNI 回 调 函 数 指 针 ( 可 选 , 如 果 为 nullptr 则 使 用 SNI 默 认 回 调 函 数 )
*
* 返 回 值 : TRUE - - 成 功
* FALSE - - 失 败 , 可 通 过 SYS_GetLastError ( ) 获 取 失 败 原 因
*/
virtual BOOL SetupSSLContextByMemory ( int iVerifyMode = SSL_VM_NONE , LPCSTR lpszPemCert = nullptr , LPCSTR lpszPemKey = nullptr , LPCSTR lpszKeyPassword = nullptr , LPCSTR lpszCAPemCert = nullptr , Fn_SNI_ServerNameCallback fnServerNameCallback = nullptr ) = 0 ;
/*
* 名 称 : 增 加 SNI 主 机 证 书
* 描 述 : SSL 服 务 端 在 SetupSSLContext ( ) 成 功 后 可 以 调 用 本 方 法 增 加 多 个 SNI 主 机 证 书
*
* 参 数 : iVerifyMode - - SSL 验 证 模 式 ( 参 考 EnSSLVerifyMode )
* lpszPemCertFile - - 证 书 文 件
* lpszPemKeyFile - - 私 钥 文 件
* lpszKeyPassword - - 私 钥 密 码 ( 没 有 密 码 则 为 空 )
* lpszCAPemCertFileOrPath - - CA 证 书 文 件 或 目 录 ( 单 向 验 证 可 选 )
*
* 返 回 值 : 正 数 - - 成 功 , 并 返 回 SNI 主 机 证 书 对 应 的 索 引 , 该 索 引 用 于 在 SNI 回 调 函 数 中 定 位 SNI 主 机
* 负 数 - - 失 败 , 可 通 过 SYS_GetLastError ( ) 获 取 失 败 原 因
*/
virtual int AddSSLContext ( int iVerifyMode = SSL_VM_NONE , LPCTSTR lpszPemCertFile = nullptr , LPCTSTR lpszPemKeyFile = nullptr , LPCTSTR lpszKeyPassword = nullptr , LPCTSTR lpszCAPemCertFileOrPath = nullptr ) = 0 ;
/*
* 名 称 : 增 加 SNI 主 机 证 书 ( 通 过 内 存 加 载 证 书 )
* 描 述 : SSL 服 务 端 在 SetupSSLContext ( ) 成 功 后 可 以 调 用 本 方 法 增 加 多 个 SNI 主 机 证 书
*
* 参 数 : iVerifyMode - - SSL 验 证 模 式 ( 参 考 EnSSLVerifyMode )
* lpszPemCert - - 证 书 内 容
* lpszPemKey - - 私 钥 内 容
* lpszKeyPassword - - 私 钥 密 码 ( 没 有 密 码 则 为 空 )
* lpszCAPemCert - - CA 证 书 内 容 ( 单 向 验 证 可 选 )
*
* 返 回 值 : 正 数 - - 成 功 , 并 返 回 SNI 主 机 证 书 对 应 的 索 引 , 该 索 引 用 于 在 SNI 回 调 函 数 中 定 位 SNI 主 机
* 负 数 - - 失 败 , 可 通 过 SYS_GetLastError ( ) 获 取 失 败 原 因
*/
virtual int AddSSLContextByMemory ( int iVerifyMode = SSL_VM_NONE , LPCSTR lpszPemCert = nullptr , LPCSTR lpszPemKey = nullptr , LPCSTR lpszKeyPassword = nullptr , LPCSTR lpszCAPemCert = nullptr ) = 0 ;
/*
* 名 称 : 绑 定 SNI 主 机 域 名
* 描 述 : SSL 服 务 端 在 AddSSLContext ( ) 成 功 后 可 以 调 用 本 方 法 绑 定 主 机 域 名 到 SNI 主 机 证 书
*
* 参 数 : lpszServerName - - 主 机 域 名
* iContextIndex - - SNI 主 机 证 书 对 应 的 索 引
*
* 返 回 值 : TRUE - - 成 功
* FALSE - - 失 败 , 可 通 过 SYS_GetLastError ( ) 获 取 失 败 原 因
*/
virtual BOOL BindSSLServerName ( LPCTSTR lpszServerName , int iContextIndex ) = 0 ;
/*
* 名 称 : 清 理 通 信 组 件 SSL 运 行 环 境
* 描 述 : 清 理 通 信 组 件 SSL 运 行 环 境 , 回 收 SSL 相 关 内 存
* 1 、 通 信 组 件 析 构 时 会 自 动 调 用 本 方 法
* 2 、 当 要 重 新 设 置 通 信 组 件 SSL 环 境 参 数 时 , 需 要 先 调 用 本 方 法 清 理 原 先 的 环 境 参 数
*
* 参 数 : 无
*
* 返 回 值 : 无
*/
virtual void CleanupSSLContext ( ) = 0 ;
/*
* 名 称 : 启 动 SSL 握 手
* 描 述 : 当 通 信 组 件 设 置 为 非 自 动 握 手 时 , 需 要 调 用 本 方 法 启 动 SSL 握 手
*
* 返 回 值 : TRUE - - 成 功
* FALSE - - 失 败 , 可 通 过 SYS_GetLastError ( ) 获 取 失 败 原 因
*/
virtual BOOL StartSSLHandShake ( CONNID dwConnID ) = 0 ;
2025-05-03 20:57:22 +08:00
# endif
public :
2025-10-15 04:32:59 +08:00
/***********************************************************************/
/***************************** 属性访问方法 *****************************/
/* 设置 Accept 预投递数量( 根据负载调整设置, Accept 预投递数量越大则支持的并发连接请求越多) */
virtual void SetAcceptSocketCount ( DWORD dwAcceptSocketCount ) = 0 ;
/* 设置通信数据缓冲区大小(根据平均通信数据包大小调整设置,通常设置为 1024 的倍数) */
virtual void SetSocketBufferSize ( DWORD dwSocketBufferSize ) = 0 ;
/* 设置监听 Socket 的等候队列大小(根据并发连接数量调整设置) */
virtual void SetSocketListenQueue ( DWORD dwSocketListenQueue ) = 0 ;
/* 设置正常心跳包间隔( 毫秒, 0 则不发送心跳包, 默认: 60 * 1000) */
virtual void SetKeepAliveTime ( DWORD dwKeepAliveTime ) = 0 ;
/* 设置异常心跳包间隔( 毫秒, 0 不发送心跳包, , 默认: 20 * 1000, 如果超过若干次 [默认: WinXP 5 次, Win7 10 次] 检测不到心跳确认包则认为已断线) */
virtual void SetKeepAliveInterval ( DWORD dwKeepAliveInterval ) = 0 ;
/* 设置是否开启 nodelay 模式( 默认: FALSE, 不开启) */
virtual void SetNoDelay ( BOOL bNoDelay ) = 0 ;
/* 获取 Accept 预投递数量 */
virtual DWORD GetAcceptSocketCount ( ) = 0 ;
/* 获取通信数据缓冲区大小 */
virtual DWORD GetSocketBufferSize ( ) = 0 ;
/* 获取监听 Socket 的等候队列大小 */
virtual DWORD GetSocketListenQueue ( ) = 0 ;
/* 获取正常心跳包间隔 */
virtual DWORD GetKeepAliveTime ( ) = 0 ;
/* 获取异常心跳包间隔 */
virtual DWORD GetKeepAliveInterval ( ) = 0 ;
/* 检查是否开启 nodelay 模式 */
virtual BOOL IsNoDelay ( ) = 0 ;
2025-05-03 20:57:22 +08:00
# ifdef _SSL_SUPPORT
2025-10-15 04:32:59 +08:00
/* 设置通信组件握手方式( 默认: TRUE, 自动握手) */
virtual void SetSSLAutoHandShake ( BOOL bAutoHandShake ) = 0 ;
/* 获取通信组件握手方式 */
virtual BOOL IsSSLAutoHandShake ( ) = 0 ;
/* 设置 SSL 加密算法列表 */
virtual void SetSSLCipherList ( LPCTSTR lpszCipherList ) = 0 ;
/* 获取 SSL 加密算法列表 */
virtual LPCTSTR GetSSLCipherList ( ) = 0 ;
/*
* 名 称 : 获 取 SSL Session 信 息
* 描 述 : 获 取 指 定 类 型 的 SSL Session 信 息 ( 输 出 类 型 参 考 : EnSSLSessionInfo )
*
* 返 回 值 : TRUE - - 成 功
* FALSE - - 失 败 , 可 通 过 SYS_GetLastError ( ) 获 取 失 败 原 因
*/
virtual BOOL GetSSLSessionInfo ( CONNID dwConnID , EnSSLSessionInfo enInfo , LPVOID * lppInfo ) = 0 ;
2025-05-03 20:57:22 +08:00
# endif
} ;
# ifdef _UDP_SUPPORT
/************************************************************************
名 称 : UDP 通 信 服 务 端 组 件 接 口
描 述 : 定 义 UDP 通 信 服 务 端 组 件 的 所 有 操 作 方 法 和 属 性 访 问 方 法
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
class IUdpServer : public IServer
{
public :
2025-10-15 04:32:59 +08:00
/***********************************************************************/
/***************************** 组件操作方法 *****************************/
2025-05-03 20:57:22 +08:00
public :
2025-10-15 04:32:59 +08:00
/***********************************************************************/
/***************************** 属性访问方法 *****************************/
2025-05-03 20:57:22 +08:00
2025-10-15 04:32:59 +08:00
/* 设置数据报文最大长度(建议在局域网环境下不超过 1432 字节,在广域网环境下不超过 548 字节) */
virtual void SetMaxDatagramSize ( DWORD dwMaxDatagramSize ) = 0 ;
/* 获取数据报文最大长度 */
virtual DWORD GetMaxDatagramSize ( ) = 0 ;
2025-05-03 20:57:22 +08:00
2025-10-15 04:32:59 +08:00
/* 设置 Receive 预投递数量( 根据负载调整设置, Receive 预投递数量越大则丢包概率越小) */
virtual void SetPostReceiveCount ( DWORD dwPostReceiveCount ) = 0 ;
/* 获取 Receive 预投递数量 */
virtual DWORD GetPostReceiveCount ( ) = 0 ;
2025-05-03 20:57:22 +08:00
2025-10-15 04:32:59 +08:00
/* 设置监测包尝试次数( 0 则不发送监测跳包,如果超过最大尝试次数则认为已断线) */
virtual void SetDetectAttempts ( DWORD dwDetectAttempts ) = 0 ;
/* 设置监测包发送间隔( 毫秒, 0 不发送监测包) */
virtual void SetDetectInterval ( DWORD dwDetectInterval ) = 0 ;
/* 获取心跳检查次数 */
virtual DWORD GetDetectAttempts ( ) = 0 ;
/* 获取心跳检查间隔 */
virtual DWORD GetDetectInterval ( ) = 0 ;
2025-05-03 20:57:22 +08:00
} ;
/************************************************************************
名 称 : Server / Agent ARQ 模 型 组 件 接 口
描 述 : 定 义 Server / Agent 组 件 的 ARQ 模 型 组 件 的 所 有 操 作 方 法
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
class IArqSocket
{
public :
2025-10-15 04:32:59 +08:00
/***********************************************************************/
/***************************** 组件操作方法 *****************************/
public :
/***********************************************************************/
/***************************** 属性访问方法 *****************************/
/* 设置是否开启 nodelay 模式( 默认: FALSE, 不开启) */
virtual void SetNoDelay ( BOOL bNoDelay ) = 0 ;
/* 设置是否关闭拥塞控制( 默认: FALSE, 不关闭) */
virtual void SetTurnoffCongestCtrl ( BOOL bTurnOff ) = 0 ;
/* 设置数据刷新间隔( 毫秒, 默认: 60) */
virtual void SetFlushInterval ( DWORD dwFlushInterval ) = 0 ;
/* 设置快速重传 ACK 跨越次数( 默认: 0, 关闭快速重传) */
virtual void SetResendByAcks ( DWORD dwResendByAcks ) = 0 ;
/* 设置发送窗口大小( 数据包数量, 默认: 128) */
virtual void SetSendWndSize ( DWORD dwSendWndSize ) = 0 ;
/* 设置接收窗口大小( 数据包数量, 默认: 512) */
virtual void SetRecvWndSize ( DWORD dwRecvWndSize ) = 0 ;
/* 设置最小重传超时时间( 毫秒, 默认: 30) */
virtual void SetMinRto ( DWORD dwMinRto ) = 0 ;
/* 设置快速握手次数限制( 默认: 5, 如果为 0 则不限制) */
virtual void SetFastLimit ( DWORD dwFastLimit ) = 0 ;
/* 设置最大传输单元( 默认: 0, 与 SetMaxDatagramSize() 一致) */
virtual void SetMaxTransUnit ( DWORD dwMaxTransUnit ) = 0 ;
/* 设置最大数据包大小( 默认: 4096) */
virtual void SetMaxMessageSize ( DWORD dwMaxMessageSize ) = 0 ;
/* 设置握手超时时间( 毫秒, 默认: 5000) */
virtual void SetHandShakeTimeout ( DWORD dwHandShakeTimeout ) = 0 ;
/* 检测是否开启 nodelay 模式 */
virtual BOOL IsNoDelay ( ) = 0 ;
/* 检测是否关闭拥塞控制 */
virtual BOOL IsTurnoffCongestCtrl ( ) = 0 ;
/* 获取数据刷新间隔 */
virtual DWORD GetFlushInterval ( ) = 0 ;
/* 获取快速重传 ACK 跨越次数 */
virtual DWORD GetResendByAcks ( ) = 0 ;
/* 获取发送窗口大小 */
virtual DWORD GetSendWndSize ( ) = 0 ;
/* 获取接收窗口大小 */
virtual DWORD GetRecvWndSize ( ) = 0 ;
/* 获取最小重传超时时间 */
virtual DWORD GetMinRto ( ) = 0 ;
/* 获取快速握手次数限制 */
virtual DWORD GetFastLimit ( ) = 0 ;
/* 获取最大传输单元 */
virtual DWORD GetMaxTransUnit ( ) = 0 ;
/* 获取最大数据包大小 */
virtual DWORD GetMaxMessageSize ( ) = 0 ;
/* 获取握手超时时间 */
virtual DWORD GetHandShakeTimeout ( ) = 0 ;
/* 获取等待发送包数量 */
virtual BOOL GetWaitingSendMessageCount ( CONNID dwConnID , int & iCount ) = 0 ;
public :
virtual ~ IArqSocket ( ) { }
2025-05-03 20:57:22 +08:00
} ;
/************************************************************************
名 称 : UDP ARQ 通 信 服 务 端 组 件 接 口
描 述 : 继 承 了 ARQ 和 Server 接 口
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
typedef DualInterface < IArqSocket , IUdpServer > IUdpArqServer ;
# endif
/************************************************************************
名 称 : 通 信 代 理 组 件 接 口
描 述 : 定 义 通 信 代 理 组 件 的 所 有 操 作 方 法 和 属 性 访 问 方 法 , 代 理 组 件 本 质 是 一 个 同 时 连 接 多 个 服 务 器 的 客 户 端 组 件
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
class IAgent : public IComplexSocket
{
public :
2025-10-15 04:32:59 +08:00
/***********************************************************************/
/***************************** 组件操作方法 *****************************/
/*
* 名 称 : 启 动 通 信 组 件
* 描 述 : 启 动 通 信 代 理 组 件 , 启 动 完 成 后 可 开 始 连 接 远 程 服 务 器
*
* 参 数 : lpszBindAddress - - 绑 定 地 址 ( 默 认 : nullptr , 绑 定 任 意 地 址 )
* bAsyncConnect - - 是 否 采 用 异 步 Connect
* 返 回 值 : TRUE - - 成 功
* FALSE - - 失 败 , 可 通 过 GetLastError ( ) 获 取 错 误 代 码
*/
virtual BOOL Start ( LPCTSTR lpszBindAddress = nullptr , BOOL bAsyncConnect = TRUE ) = 0 ;
/*
* 名 称 : 连 接 服 务 器
* 描 述 : 连 接 服 务 器 , 连 接 成 功 后 IAgentListener 会 接 收 到 OnConnect ( ) / OnHandShake ( ) 事 件
*
* 参 数 : lpszRemoteAddress - - 服 务 端 地 址
* usPort - - 服 务 端 端 口
* pdwConnID - - 连 接 ID ( 默 认 : nullptr , 不 获 取 连 接 ID )
* pExtra - - 连 接 附 加 数 据 ( 默 认 : nullptr )
* usLocalPort - - 本 地 端 口 ( 默 认 : 0 )
* lpszLocalAddress - - 本 地 地 址 ( 默 认 : nullptr , 使 用 Start ( ) 方 法 中 绑 定 的 地 址 )
* 返 回 值 : TRUE - - 成 功
* FALSE - - 失 败 , 可 通 过 SYS_GetLastError ( ) 获 取 错 误 代 码
*/
virtual BOOL Connect ( LPCTSTR lpszRemoteAddress , USHORT usPort , CONNID * pdwConnID = nullptr , PVOID pExtra = nullptr , USHORT usLocalPort = 0 , LPCTSTR lpszLocalAddress = nullptr ) = 0 ;
public :
/***********************************************************************/
/***************************** 属性访问方法 *****************************/
/* 获取某个连接的远程主机信息 */
virtual BOOL GetRemoteHost ( CONNID dwConnID , TCHAR lpszHost [ ] , int & iHostLen , USHORT & usPort ) = 0 ;
2025-05-03 20:57:22 +08:00
} ;
/************************************************************************
名 称 : TCP 通 信 代 理 组 件 接 口
描 述 : 定 义 TCP 通 信 代 理 组 件 的 所 有 操 作 方 法 和 属 性 访 问 方 法
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
class ITcpAgent : public IAgent
{
public :
2025-10-15 04:32:59 +08:00
/***********************************************************************/
/***************************** 组件操作方法 *****************************/
2025-05-03 20:57:22 +08:00
2025-10-15 04:32:59 +08:00
/*
* 名 称 : 发 送 小 文 件
* 描 述 : 向 指 定 连 接 发 送 4096 KB 以 下 的 小 文 件
*
* 参 数 : dwConnID - - 连 接 ID
* lpszFileName - - 文 件 路 径
* pHead - - 头 部 附 加 数 据
* pTail - - 尾 部 附 加 数 据
* 返 回 值 : TRUE - - 成 功
* FALSE - - 失 败 , 可 通 过 SYS_GetLastError ( ) 获 取 错 误 代 码
*/
virtual BOOL SendSmallFile ( CONNID dwConnID , LPCTSTR lpszFileName , const LPWSABUF pHead = nullptr , const LPWSABUF pTail = nullptr ) = 0 ;
2025-05-03 20:57:22 +08:00
# ifdef _SSL_SUPPORT
2025-10-15 04:32:59 +08:00
/*
* 名 称 : 初 始 化 通 信 组 件 SSL 环 境 参 数
* 描 述 : SSL 环 境 参 数 必 须 在 SSL 通 信 组 件 启 动 前 完 成 初 始 化 , 否 则 启 动 失 败
*
* 参 数 : iVerifyMode - - SSL 验 证 模 式 ( 参 考 EnSSLVerifyMode )
* lpszPemCertFile - - 证 书 文 件 ( 客 户 端 可 选 )
* lpszPemKeyFile - - 私 钥 文 件 ( 客 户 端 可 选 )
* lpszKeyPassword - - 私 钥 密 码 ( 没 有 密 码 则 为 空 )
* lpszCAPemCertFileOrPath - - CA 证 书 文 件 或 目 录 ( 单 向 验 证 或 客 户 端 可 选 )
*
* 返 回 值 : TRUE - - 成 功
* FALSE - - 失 败 , 可 通 过 SYS_GetLastError ( ) 获 取 失 败 原 因
*/
virtual BOOL SetupSSLContext ( int iVerifyMode = SSL_VM_NONE , LPCTSTR lpszPemCertFile = nullptr , LPCTSTR lpszPemKeyFile = nullptr , LPCTSTR lpszKeyPassword = nullptr , LPCTSTR lpszCAPemCertFileOrPath = nullptr ) = 0 ;
/*
* 名 称 : 初 始 化 通 信 组 件 SSL 环 境 参 数 ( 通 过 内 存 加 载 证 书 )
* 描 述 : SSL 环 境 参 数 必 须 在 SSL 通 信 组 件 启 动 前 完 成 初 始 化 , 否 则 启 动 失 败
*
* 参 数 : iVerifyMode - - SSL 验 证 模 式 ( 参 考 EnSSLVerifyMode )
* lpszPemCert - - 证 书 内 容
* lpszPemKey - - 私 钥 内 容
* lpszKeyPassword - - 私 钥 密 码 ( 没 有 密 码 则 为 空 )
* lpszCAPemCert - - CA 证 书 内 容 ( 单 向 验 证 或 客 户 端 可 选 )
*
* 返 回 值 : TRUE - - 成 功
* FALSE - - 失 败 , 可 通 过 SYS_GetLastError ( ) 获 取 失 败 原 因
*/
virtual BOOL SetupSSLContextByMemory ( int iVerifyMode = SSL_VM_NONE , LPCSTR lpszPemCert = nullptr , LPCSTR lpszPemKey = nullptr , LPCSTR lpszKeyPassword = nullptr , LPCSTR lpszCAPemCert = nullptr ) = 0 ;
/*
* 名 称 : 清 理 通 信 组 件 SSL 运 行 环 境
* 描 述 : 清 理 通 信 组 件 SSL 运 行 环 境 , 回 收 SSL 相 关 内 存
* 1 、 通 信 组 件 析 构 时 会 自 动 调 用 本 方 法
* 2 、 当 要 重 新 设 置 通 信 组 件 SSL 环 境 参 数 时 , 需 要 先 调 用 本 方 法 清 理 原 先 的 环 境 参 数
*
* 参 数 : 无
*
* 返 回 值 : 无
*/
virtual void CleanupSSLContext ( ) = 0 ;
/*
* 名 称 : 启 动 SSL 握 手
* 描 述 : 当 通 信 组 件 设 置 为 非 自 动 握 手 时 , 需 要 调 用 本 方 法 启 动 SSL 握 手
*
* 返 回 值 : TRUE - - 成 功
* FALSE - - 失 败 , 可 通 过 SYS_GetLastError ( ) 获 取 失 败 原 因
*/
virtual BOOL StartSSLHandShake ( CONNID dwConnID ) = 0 ;
2025-05-03 20:57:22 +08:00
# endif
public :
2025-10-15 04:32:59 +08:00
/***********************************************************************/
/***************************** 属性访问方法 *****************************/
/* 设置同步连接超时时间(毫秒) */
virtual void SetSyncConnectTimeout ( DWORD dwSyncConnectTimeout ) = 0 ;
/* 设置通信数据缓冲区大小(根据平均通信数据包大小调整设置,通常设置为 1024 的倍数) */
virtual void SetSocketBufferSize ( DWORD dwSocketBufferSize ) = 0 ;
/* 设置正常心跳包间隔( 毫秒, 0 则不发送心跳包, 默认: 60 * 1000) */
virtual void SetKeepAliveTime ( DWORD dwKeepAliveTime ) = 0 ;
/* 设置异常心跳包间隔( 毫秒, 0 不发送心跳包, , 默认: 20 * 1000, 如果超过若干次 [默认: WinXP 5 次, Win7 10 次] 检测不到心跳确认包则认为已断线) */
virtual void SetKeepAliveInterval ( DWORD dwKeepAliveInterval ) = 0 ;
/* 设置是否开启 nodelay 模式( 默认: FALSE, 不开启) */
virtual void SetNoDelay ( BOOL bNoDelay ) = 0 ;
/* 获取同步连接超时时间 */
virtual DWORD GetSyncConnectTimeout ( ) = 0 ;
/* 获取通信数据缓冲区大小 */
virtual DWORD GetSocketBufferSize ( ) = 0 ;
/* 获取正常心跳包间隔 */
virtual DWORD GetKeepAliveTime ( ) = 0 ;
/* 获取异常心跳包间隔 */
virtual DWORD GetKeepAliveInterval ( ) = 0 ;
/* 检查是否开启 nodelay 模式 */
virtual BOOL IsNoDelay ( ) = 0 ;
2025-05-03 20:57:22 +08:00
# ifdef _SSL_SUPPORT
2025-10-15 04:32:59 +08:00
/* 设置通信组件握手方式( 默认: TRUE, 自动握手) */
virtual void SetSSLAutoHandShake ( BOOL bAutoHandShake ) = 0 ;
/* 获取通信组件握手方式 */
virtual BOOL IsSSLAutoHandShake ( ) = 0 ;
/* 设置 SSL 加密算法列表 */
virtual void SetSSLCipherList ( LPCTSTR lpszCipherList ) = 0 ;
/* 获取 SSL 加密算法列表 */
virtual LPCTSTR GetSSLCipherList ( ) = 0 ;
/*
* 名 称 : 获 取 SSL Session 信 息
* 描 述 : 获 取 指 定 类 型 的 SSL Session 信 息 ( 输 出 类 型 参 考 : EnSSLSessionInfo )
*
* 返 回 值 : TRUE - - 成 功
* FALSE - - 失 败 , 可 通 过 SYS_GetLastError ( ) 获 取 失 败 原 因
*/
virtual BOOL GetSSLSessionInfo ( CONNID dwConnID , EnSSLSessionInfo enInfo , LPVOID * lppInfo ) = 0 ;
2025-05-03 20:57:22 +08:00
# endif
} ;
/************************************************************************
名 称 : 通 信 客 户 端 组 件 接 口
描 述 : 定 义 通 信 客 户 端 组 件 的 所 有 操 作 方 法 和 属 性 访 问 方 法
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
class IClient
{
public :
2025-10-15 04:32:59 +08:00
/***********************************************************************/
/***************************** 组件操作方法 *****************************/
/*
* 名 称 : 启 动 通 信 组 件
* 描 述 : 启 动 客 户 端 通 信 组 件 并 连 接 服 务 端 , 启 动 完 成 后 可 开 始 收 发 数 据
*
* 参 数 : lpszRemoteAddress - - 服 务 端 地 址
* usPort - - 服 务 端 端 口
* bAsyncConnect - - 是 否 采 用 异 步 Connect
* lpszBindAddress - - 绑 定 地 址 ( 默 认 : nullptr , TcpClient / UdpClient - > 不 执 行 绑 定 操 作 , UdpCast 绑 定 - > 任 意 地 址 )
* usLocalPort - - 本 地 端 口 ( 默 认 : 0 )
* 返 回 值 : TRUE - - 成 功
* FALSE - - 失 败 , 可 通 过 GetLastError ( ) 获 取 错 误 代 码
*/
virtual BOOL Start ( LPCTSTR lpszRemoteAddress , USHORT usPort , BOOL bAsyncConnect = TRUE , LPCTSTR lpszBindAddress = nullptr , USHORT usLocalPort = 0 ) = 0 ;
/*
* 名 称 : 关 闭 通 信 组 件
* 描 述 : 关 闭 客 户 端 通 信 组 件 , 关 闭 完 成 后 断 开 与 服 务 端 的 连 接 并 释 放 所 有 资 源
*
* 参 数 :
* 返 回 值 : TRUE - - 成 功
* FALSE - - 失 败 , 可 通 过 GetLastError ( ) 获 取 错 误 代 码
*/
virtual BOOL Stop ( ) = 0 ;
/*
* 名 称 : 发 送 数 据
* 描 述 : 向 服 务 端 发 送 数 据
*
* 参 数 : pBuffer - - 发 送 缓 冲 区
* iLength - - 发 送 缓 冲 区 长 度
* iOffset - - 发 送 缓 冲 区 指 针 偏 移 量
* 返 回 值 : TRUE - - 成 功
* FALSE - - 失 败 , 可 通 过 SYS_GetLastError ( ) 获 取 错 误 代 码
*/
virtual BOOL Send ( const BYTE * pBuffer , int iLength , int iOffset = 0 ) = 0 ;
/*
* 名 称 : 发 送 多 组 数 据
* 描 述 : 向 服 务 端 发 送 多 组 数 据
* TCP - 顺 序 发 送 所 有 数 据 包
* UDP - 把 所 有 数 据 包 组 合 成 一 个 数 据 包 发 送 ( 数 据 包 的 总 长 度 不 能 大 于 设 置 的 UDP 包 最 大 长 度 )
*
* 参 数 : pBuffers - - 发 送 缓 冲 区 数 组
* iCount - - 发 送 缓 冲 区 数 目
* 返 回 值 : TRUE - - 成 功
* FALSE - - 失 败 , 可 通 过 SYS_GetLastError ( ) 获 取 错 误 代 码
*/
virtual BOOL SendPackets ( const WSABUF pBuffers [ ] , int iCount ) = 0 ;
/*
* 名 称 : 暂 停 / 恢 复 接 收
* 描 述 : 暂 停 / 恢 复 某 个 连 接 的 数 据 接 收 工 作
*
* bPause - - TRUE - 暂 停 , FALSE - 恢 复
* 返 回 值 : TRUE - - 成 功
* FALSE - - 失 败
*/
virtual BOOL PauseReceive ( BOOL bPause = TRUE ) = 0 ;
/*
* 名 称 : 等 待
* 描 述 : 等 待 通 信 组 件 停 止 运 行
*
* 参 数 : dwMilliseconds - - 超 时 时 间 ( 毫 秒 , 默 认 : - 1 , 永 不 超 时 )
* 返 回 值 : TRUE - - 成 功
* FALSE - - 失 败 , 可 通 过 SYS_GetLastError ( ) 获 取 错 误 代 码
*/
virtual BOOL Wait ( DWORD dwMilliseconds = INFINITE ) = 0 ;
public :
/***********************************************************************/
/***************************** 属性访问方法 *****************************/
/* 设置连接的附加数据 */
virtual void SetExtra ( PVOID pExtra ) = 0 ;
/* 获取连接的附加数据 */
virtual PVOID GetExtra ( ) = 0 ;
/* 检测是否为安全连接( SSL/HTTPS) */
virtual BOOL IsSecure ( ) = 0 ;
/* 检查通信组件是否已启动 */
virtual BOOL HasStarted ( ) = 0 ;
/* 查看通信组件当前状态 */
virtual EnServiceState GetState ( ) = 0 ;
/* 获取最近一次失败操作的错误代码 */
virtual EnSocketError GetLastError ( ) = 0 ;
/* 获取最近一次失败操作的错误描述 */
virtual LPCTSTR GetLastErrorDesc ( ) = 0 ;
/* 获取该组件对象的连接 ID */
virtual CONNID GetConnectionID ( ) = 0 ;
/* 获取 Client Socket 的地址信息 */
virtual BOOL GetLocalAddress ( TCHAR lpszAddress [ ] , int & iAddressLen , USHORT & usPort ) = 0 ;
/* 获取连接的远程主机信息 */
virtual BOOL GetRemoteHost ( TCHAR lpszHost [ ] , int & iHostLen , USHORT & usPort ) = 0 ;
/* 获取连接中未发出数据的长度 */
virtual BOOL GetPendingDataLength ( int & iPending ) = 0 ;
/* 获取连接的数据接收状态 */
virtual BOOL IsPauseReceive ( BOOL & bPaused ) = 0 ;
/* 检测是否有效连接 */
virtual BOOL IsConnected ( ) = 0 ;
/* 设置地址重用选项 */
virtual void SetReuseAddressPolicy ( EnReuseAddressPolicy enReusePolicy ) = 0 ;
/* 设置内存块缓存池大小 */
virtual void SetFreeBufferPoolSize ( DWORD dwFreeBufferPoolSize ) = 0 ;
/* 设置内存块缓存池回收阀值 */
virtual void SetFreeBufferPoolHold ( DWORD dwFreeBufferPoolHold ) = 0 ;
/* 获取地址重用选项 */
virtual EnReuseAddressPolicy GetReuseAddressPolicy ( ) = 0 ;
/* 获取内存块缓存池大小 */
virtual DWORD GetFreeBufferPoolSize ( ) = 0 ;
/* 获取内存块缓存池回收阀值 */
virtual DWORD GetFreeBufferPoolHold ( ) = 0 ;
public :
virtual ~ IClient ( ) { }
2025-05-03 20:57:22 +08:00
} ;
/************************************************************************
名 称 : TCP 通 信 客 户 端 组 件 接 口
描 述 : 定 义 TCP 通 信 客 户 端 组 件 的 所 有 操 作 方 法 和 属 性 访 问 方 法
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
class ITcpClient : public IClient
{
public :
2025-10-15 04:32:59 +08:00
/***********************************************************************/
/***************************** 组件操作方法 *****************************/
2025-05-03 20:57:22 +08:00
2025-10-15 04:32:59 +08:00
/*
* 名 称 : 发 送 小 文 件
* 描 述 : 向 服 务 端 发 送 4096 KB 以 下 的 小 文 件
*
* 参 数 : lpszFileName - - 文 件 路 径
* pHead - - 头 部 附 加 数 据
* pTail - - 尾 部 附 加 数 据
* 返 回 值 : TRUE - - 成 功
* FALSE - - 失 败 , 可 通 过 SYS_GetLastError ( ) 获 取 错 误 代 码
*/
virtual BOOL SendSmallFile ( LPCTSTR lpszFileName , const LPWSABUF pHead = nullptr , const LPWSABUF pTail = nullptr ) = 0 ;
2025-05-03 20:57:22 +08:00
# ifdef _SSL_SUPPORT
2025-10-15 04:32:59 +08:00
/*
* 名 称 : 初 始 化 通 信 组 件 SSL 环 境 参 数
* 描 述 : SSL 环 境 参 数 必 须 在 SSL 通 信 组 件 启 动 前 完 成 初 始 化 , 否 则 启 动 失 败
*
* 参 数 : iVerifyMode - - SSL 验 证 模 式 ( 参 考 EnSSLVerifyMode )
* lpszPemCertFile - - 证 书 文 件 ( 客 户 端 可 选 )
* lpszPemKeyFile - - 私 钥 文 件 ( 客 户 端 可 选 )
* lpszKeyPassword - - 私 钥 密 码 ( 没 有 密 码 则 为 空 )
* lpszCAPemCertFileOrPath - - CA 证 书 文 件 或 目 录 ( 单 向 验 证 或 客 户 端 可 选 )
*
* 返 回 值 : TRUE - - 成 功
* FALSE - - 失 败 , 可 通 过 SYS_GetLastError ( ) 获 取 失 败 原 因
*/
virtual BOOL SetupSSLContext ( int iVerifyMode = SSL_VM_NONE , LPCTSTR lpszPemCertFile = nullptr , LPCTSTR lpszPemKeyFile = nullptr , LPCTSTR lpszKeyPassword = nullptr , LPCTSTR lpszCAPemCertFileOrPath = nullptr ) = 0 ;
/*
* 名 称 : 初 始 化 通 信 组 件 SSL 环 境 参 数 ( 通 过 内 存 加 载 证 书 )
* 描 述 : SSL 环 境 参 数 必 须 在 SSL 通 信 组 件 启 动 前 完 成 初 始 化 , 否 则 启 动 失 败
*
* 参 数 : iVerifyMode - - SSL 验 证 模 式 ( 参 考 EnSSLVerifyMode )
* lpszPemCert - - 证 书 内 容
* lpszPemKey - - 私 钥 内 容
* lpszKeyPassword - - 私 钥 密 码 ( 没 有 密 码 则 为 空 )
* lpszCAPemCert - - CA 证 书 内 容 ( 单 向 验 证 或 客 户 端 可 选 )
*
* 返 回 值 : TRUE - - 成 功
* FALSE - - 失 败 , 可 通 过 SYS_GetLastError ( ) 获 取 失 败 原 因
*/
virtual BOOL SetupSSLContextByMemory ( int iVerifyMode = SSL_VM_NONE , LPCSTR lpszPemCert = nullptr , LPCSTR lpszPemKey = nullptr , LPCSTR lpszKeyPassword = nullptr , LPCSTR lpszCAPemCert = nullptr ) = 0 ;
/*
* 名 称 : 清 理 通 信 组 件 SSL 运 行 环 境
* 描 述 : 清 理 通 信 组 件 SSL 运 行 环 境 , 回 收 SSL 相 关 内 存
* 1 、 通 信 组 件 析 构 时 会 自 动 调 用 本 方 法
* 2 、 当 要 重 新 设 置 通 信 组 件 SSL 环 境 参 数 时 , 需 要 先 调 用 本 方 法 清 理 原 先 的 环 境 参 数
*
* 参 数 : 无
*
* 返 回 值 : 无
*/
virtual void CleanupSSLContext ( ) = 0 ;
/*
* 名 称 : 启 动 SSL 握 手
* 描 述 : 当 通 信 组 件 设 置 为 非 自 动 握 手 时 , 需 要 调 用 本 方 法 启 动 SSL 握 手
*
* 返 回 值 : TRUE - - 成 功
* FALSE - - 失 败 , 可 通 过 SYS_GetLastError ( ) 获 取 失 败 原 因
*/
virtual BOOL StartSSLHandShake ( ) = 0 ;
2025-05-03 20:57:22 +08:00
# endif
public :
2025-10-15 04:32:59 +08:00
/***********************************************************************/
/***************************** 属性访问方法 *****************************/
/* 设置同步连接超时时间(毫秒) */
virtual void SetSyncConnectTimeout ( DWORD dwSyncConnectTimeout ) = 0 ;
/* 设置通信数据缓冲区大小(根据平均通信数据包大小调整设置,通常设置为:(N * 1024) - sizeof(TBufferObj)) */
virtual void SetSocketBufferSize ( DWORD dwSocketBufferSize ) = 0 ;
/* 设置正常心跳包间隔( 毫秒, 0 则不发送心跳包, 默认: 60 * 1000) */
virtual void SetKeepAliveTime ( DWORD dwKeepAliveTime ) = 0 ;
/* 设置异常心跳包间隔( 毫秒, 0 不发送心跳包, , 默认: 20 * 1000, 如果超过若干次 [默认: WinXP 5 次, Win7 10 次] 检测不到心跳确认包则认为已断线) */
virtual void SetKeepAliveInterval ( DWORD dwKeepAliveInterval ) = 0 ;
/* 设置是否开启 nodelay 模式( 默认: FALSE, 不开启) */
virtual void SetNoDelay ( BOOL bNoDelay ) = 0 ;
/* 获取同步连接超时时间 */
virtual DWORD GetSyncConnectTimeout ( ) = 0 ;
/* 获取通信数据缓冲区大小 */
virtual DWORD GetSocketBufferSize ( ) = 0 ;
/* 获取正常心跳包间隔 */
virtual DWORD GetKeepAliveTime ( ) = 0 ;
/* 获取异常心跳包间隔 */
virtual DWORD GetKeepAliveInterval ( ) = 0 ;
/* 检查是否开启 nodelay 模式 */
virtual BOOL IsNoDelay ( ) = 0 ;
2025-05-03 20:57:22 +08:00
# ifdef _SSL_SUPPORT
2025-10-15 04:32:59 +08:00
/* 设置通信组件握手方式( 默认: TRUE, 自动握手) */
virtual void SetSSLAutoHandShake ( BOOL bAutoHandShake ) = 0 ;
/* 获取通信组件握手方式 */
virtual BOOL IsSSLAutoHandShake ( ) = 0 ;
/* 设置 SSL 加密算法列表 */
virtual void SetSSLCipherList ( LPCTSTR lpszCipherList ) = 0 ;
/* 获取 SSL 加密算法列表 */
virtual LPCTSTR GetSSLCipherList ( ) = 0 ;
/*
* 名 称 : 获 取 SSL Session 信 息
* 描 述 : 获 取 指 定 类 型 的 SSL Session 信 息 ( 输 出 类 型 参 考 : EnSSLSessionInfo )
*
* 返 回 值 : TRUE - - 成 功
* FALSE - - 失 败 , 可 通 过 SYS_GetLastError ( ) 获 取 失 败 原 因
*/
virtual BOOL GetSSLSessionInfo ( EnSSLSessionInfo enInfo , LPVOID * lppInfo ) = 0 ;
2025-05-03 20:57:22 +08:00
# endif
} ;
# ifdef _UDP_SUPPORT
/************************************************************************
名 称 : UDP 通 信 客 户 端 组 件 接 口
描 述 : 定 义 UDP 通 信 客 户 端 组 件 的 所 有 操 作 方 法 和 属 性 访 问 方 法
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
class IUdpClient : public IClient
{
public :
2025-10-15 04:32:59 +08:00
/***********************************************************************/
/***************************** 组件操作方法 *****************************/
2025-05-03 20:57:22 +08:00
public :
2025-10-15 04:32:59 +08:00
/***********************************************************************/
/***************************** 属性访问方法 *****************************/
2025-05-03 20:57:22 +08:00
2025-10-15 04:32:59 +08:00
/* 设置数据报文最大长度(建议在局域网环境下不超过 1432 字节,在广域网环境下不超过 548 字节) */
virtual void SetMaxDatagramSize ( DWORD dwMaxDatagramSize ) = 0 ;
/* 获取数据报文最大长度 */
virtual DWORD GetMaxDatagramSize ( ) = 0 ;
2025-05-03 20:57:22 +08:00
2025-10-15 04:32:59 +08:00
/* 设置监测包尝试次数( 0 则不发送监测跳包,如果超过最大尝试次数则认为已断线) */
virtual void SetDetectAttempts ( DWORD dwDetectAttempts ) = 0 ;
/* 设置监测包发送间隔( 毫秒, 0 不发送监测包) */
virtual void SetDetectInterval ( DWORD dwDetectInterval ) = 0 ;
/* 获取心跳检查次数 */
virtual DWORD GetDetectAttempts ( ) = 0 ;
/* 获取心跳检查间隔 */
virtual DWORD GetDetectInterval ( ) = 0 ;
2025-05-03 20:57:22 +08:00
} ;
/************************************************************************
名 称 : UDP 传 播 组 件 接 口
描 述 : 定 义 UDP 传 播 ( 组 播 或 广 播 ) 组 件 的 所 有 操 作 方 法 和 属 性 访 问 方 法
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
class IUdpCast : public IClient
{
public :
2025-10-15 04:32:59 +08:00
/***********************************************************************/
/***************************** 组件操作方法 *****************************/
2025-05-03 20:57:22 +08:00
public :
2025-10-15 04:32:59 +08:00
/***********************************************************************/
/***************************** 属性访问方法 *****************************/
2025-05-03 20:57:22 +08:00
2025-10-15 04:32:59 +08:00
/* 设置数据报文最大长度(建议在局域网环境下不超过 1432 字节,在广域网环境下不超过 548 字节) */
virtual void SetMaxDatagramSize ( DWORD dwMaxDatagramSize ) = 0 ;
/* 获取数据报文最大长度 */
virtual DWORD GetMaxDatagramSize ( ) = 0 ;
2025-05-03 20:57:22 +08:00
2025-10-15 04:32:59 +08:00
/* 设置传播模式(组播或广播) */
virtual void SetCastMode ( EnCastMode enCastMode ) = 0 ;
/* 获取传播模式 */
virtual EnCastMode GetCastMode ( ) = 0 ;
2025-05-03 20:57:22 +08:00
2025-10-15 04:32:59 +08:00
/* 设置组播报文的 TTL( 0 - 255) */
virtual void SetMultiCastTtl ( int iMCTtl ) = 0 ;
/* 获取组播报文的 TTL */
virtual int GetMultiCastTtl ( ) = 0 ;
2025-05-03 20:57:22 +08:00
2025-10-15 04:32:59 +08:00
/* 设置是否启用组播环路( TRUE or FALSE) */
virtual void SetMultiCastLoop ( BOOL bMCLoop ) = 0 ;
/* 检测是否启用组播环路 */
virtual BOOL IsMultiCastLoop ( ) = 0 ;
2025-05-03 20:57:22 +08:00
2025-10-15 04:32:59 +08:00
/* 获取当前数据报的远程地址信息(通常在 OnReceive 事件中调用) */
virtual BOOL GetRemoteAddress ( TCHAR lpszAddress [ ] , int & iAddressLen , USHORT & usPort ) = 0 ;
2025-05-03 20:57:22 +08:00
} ;
/************************************************************************
名 称 : UDP 节 点 组 件 接 口
描 述 : 定 义 UDP 节 点 组 件 的 所 有 操 作 方 法 和 属 性 访 问 方 法
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
class IUdpNode
{
public :
2025-10-15 04:32:59 +08:00
/***********************************************************************/
/***************************** 组件操作方法 *****************************/
/*
* 名 称 : 启 动 通 信 组 件
* 描 述 : 启 动 UDP 节 点 通 信 组 件 , 启 动 完 成 后 可 开 始 收 发 数 据
*
* 参 数 : lpszBindAddress - - 绑 定 地 址 ( 默 认 : nullptr , 绑 定 任 意 地 址 )
* usPort - - 本 地 端 口 ( 默 认 : 0 )
* enCastMode - - 传 播 模 式 ( 默 认 : CM_UNICAST )
* lpszCastAddress - - 传 播 地 址 ( 默 认 : nullptr , 当 enCaseMode 为 CM_MULTICAST 或 CM_BROADCAST 时 有 效 )
* 返 回 值 : TRUE - - 成 功
* FALSE - - 失 败 , 可 通 过 GetLastError ( ) 获 取 错 误 代 码
*/
virtual BOOL Start ( LPCTSTR lpszBindAddress = nullptr , USHORT usPort = 0 , EnCastMode enCastMode = CM_UNICAST , LPCTSTR lpszCastAddress = nullptr ) = 0 ;
/*
* 名 称 : 关 闭 通 信 组 件
* 描 述 : 关 闭 UDP 节 点 通 信 组 件 , 关 闭 完 成 后 释 放 所 有 资 源
*
* 参 数 :
* 返 回 值 : TRUE - - 成 功
* FALSE - - 失 败 , 可 通 过 GetLastError ( ) 获 取 错 误 代 码
*/
virtual BOOL Stop ( ) = 0 ;
/*
* 名 称 : 发 送 数 据
* 描 述 : 向 指 定 地 址 发 送 数 据
*
* 参 数 : lpszRemoteAddress - - 远 程 地 址
* usRemotePort - - 远 程 端 口
* pBuffer - - 发 送 缓 冲 区
* iLength - - 发 送 缓 冲 区 长 度
* iOffset - - 发 送 缓 冲 区 指 针 偏 移 量
* 返 回 值 : TRUE - - 成 功
* FALSE - - 失 败 , 可 通 过 SYS_GetLastError ( ) 获 取 错 误 代 码
*/
virtual BOOL Send ( LPCTSTR lpszRemoteAddress , USHORT usRemotePort , const BYTE * pBuffer , int iLength , int iOffset = 0 ) = 0 ;
/*
* 名 称 : 发 送 多 组 数 据
* 描 述 : 向 指 定 地 址 发 送 多 组 数 据 , 把 所 有 数 据 包 组 合 成 一 个 数 据 包 发 送 ( 数 据 包 的 总 长 度 不 能 大 于 设 置 的 UDP 包 最 大 长 度 )
*
* 参 数 : lpszRemoteAddress - - 远 程 地 址
* usRemotePort - - 远 程 端 口
* pBuffers - - 发 送 缓 冲 区 数 组
* iCount - - 发 送 缓 冲 区 数 目
* 返 回 值 : TRUE - - 成 功
* FALSE - - 失 败 , 可 通 过 SYS_GetLastError ( ) 获 取 错 误 代 码
*/
virtual BOOL SendPackets ( LPCTSTR lpszRemoteAddress , USHORT usRemotePort , const WSABUF pBuffers [ ] , int iCount ) = 0 ;
/*
* 名 称 : 发 送 数 据
* 描 述 : 向 传 播 地 址 发 送 数 据
*
* 参 数 : pBuffer - - 发 送 缓 冲 区
* iLength - - 发 送 缓 冲 区 长 度
* iOffset - - 发 送 缓 冲 区 指 针 偏 移 量
* 返 回 值 : TRUE - - 成 功
* FALSE - - 失 败 , 可 通 过 SYS_GetLastError ( ) 获 取 错 误 代 码
*/
virtual BOOL SendCast ( const BYTE * pBuffer , int iLength , int iOffset = 0 ) = 0 ;
/*
* 名 称 : 发 送 多 组 数 据
* 描 述 : 向 传 播 地 址 发 送 多 组 数 据 , 把 所 有 数 据 包 组 合 成 一 个 数 据 包 发 送 ( 数 据 包 的 总 长 度 不 能 大 于 设 置 的 UDP 包 最 大 长 度 )
*
* 参 数 : pBuffers - - 发 送 缓 冲 区 数 组
* iCount - - 发 送 缓 冲 区 数 目
* 返 回 值 : TRUE - - 成 功
* FALSE - - 失 败 , 可 通 过 SYS_GetLastError ( ) 获 取 错 误 代 码
*/
virtual BOOL SendCastPackets ( const WSABUF pBuffers [ ] , int iCount ) = 0 ;
/*
* 名 称 : 等 待
* 描 述 : 等 待 通 信 组 件 停 止 运 行
*
* 参 数 : dwMilliseconds - - 超 时 时 间 ( 毫 秒 , 默 认 : - 1 , 永 不 超 时 )
* 返 回 值 : TRUE - - 成 功
* FALSE - - 失 败 , 可 通 过 SYS_GetLastError ( ) 获 取 错 误 代 码
*/
virtual BOOL Wait ( DWORD dwMilliseconds = INFINITE ) = 0 ;
public :
/***********************************************************************/
/***************************** 属性访问方法 *****************************/
/* 设置附加数据 */
virtual void SetExtra ( PVOID pExtra ) = 0 ;
/* 获取附加数据 */
virtual PVOID GetExtra ( ) = 0 ;
/* 检查通信组件是否已启动 */
virtual BOOL HasStarted ( ) = 0 ;
/* 查看通信组件当前状态 */
virtual EnServiceState GetState ( ) = 0 ;
/* 获取最近一次失败操作的错误代码 */
virtual EnSocketError GetLastError ( ) = 0 ;
/* 获取最近一次失败操作的错误描述 */
virtual LPCTSTR GetLastErrorDesc ( ) = 0 ;
/* 获取本节点地址 */
virtual BOOL GetLocalAddress ( TCHAR lpszAddress [ ] , int & iAddressLen , USHORT & usPort ) = 0 ;
/* 获取本节点传播地址 */
virtual BOOL GetCastAddress ( TCHAR lpszAddress [ ] , int & iAddressLen , USHORT & usPort ) = 0 ;
/* 获取传播模式 */
virtual EnCastMode GetCastMode ( ) = 0 ;
/* 获取未发出数据的长度 */
virtual BOOL GetPendingDataLength ( int & iPending ) = 0 ;
/* 设置数据报文最大长度(建议在局域网环境下不超过 1432 字节,在广域网环境下不超过 548 字节) */
virtual void SetMaxDatagramSize ( DWORD dwMaxDatagramSize ) = 0 ;
/* 获取数据报文最大长度 */
virtual DWORD GetMaxDatagramSize ( ) = 0 ;
/* 设置组播报文的 TTL( 0 - 255) */
virtual void SetMultiCastTtl ( int iMCTtl ) = 0 ;
/* 获取组播报文的 TTL */
virtual int GetMultiCastTtl ( ) = 0 ;
/* 设置是否启用组播环路( TRUE or FALSE) */
virtual void SetMultiCastLoop ( BOOL bMCLoop ) = 0 ;
/* 检测是否启用组播环路 */
virtual BOOL IsMultiCastLoop ( ) = 0 ;
/* 设置地址重用选项 */
virtual void SetReuseAddressPolicy ( EnReuseAddressPolicy enReusePolicy ) = 0 ;
/* 设置工作线程数量(通常设置为 2 * CPU + 2) */
virtual void SetWorkerThreadCount ( DWORD dwWorkerThreadCount ) = 0 ;
/* 设置 Receive 预投递数量( 根据负载调整设置, Receive 预投递数量越大则丢包概率越小) */
virtual void SetPostReceiveCount ( DWORD dwPostReceiveCount ) = 0 ;
/* 设置内存块缓存池大小 */
virtual void SetFreeBufferPoolSize ( DWORD dwFreeBufferPoolSize ) = 0 ;
/* 设置内存块缓存池回收阀值 */
virtual void SetFreeBufferPoolHold ( DWORD dwFreeBufferPoolHold ) = 0 ;
/* 获取地址重用选项 */
virtual EnReuseAddressPolicy GetReuseAddressPolicy ( ) = 0 ;
/* 获取工作线程数量 */
virtual DWORD GetWorkerThreadCount ( ) = 0 ;
/* 获取 Receive 预投递数量 */
virtual DWORD GetPostReceiveCount ( ) = 0 ;
/* 获取内存块缓存池大小 */
virtual DWORD GetFreeBufferPoolSize ( ) = 0 ;
/* 获取内存块缓存池回收阀值 */
virtual DWORD GetFreeBufferPoolHold ( ) = 0 ;
public :
virtual ~ IUdpNode ( ) { }
2025-05-03 20:57:22 +08:00
} ;
/************************************************************************
名 称 : Client ARQ 模 型 组 件 接 口
描 述 : 定 义 Client 组 件 的 ARQ 模 型 组 件 的 所 有 操 作 方 法
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
class IArqClient
{
public :
2025-10-15 04:32:59 +08:00
/***********************************************************************/
/***************************** 组件操作方法 *****************************/
public :
/***********************************************************************/
/***************************** 属性访问方法 *****************************/
/* 设置是否开启 nodelay 模式( 默认: FALSE, 不开启) */
virtual void SetNoDelay ( BOOL bNoDelay ) = 0 ;
/* 设置是否关闭拥塞控制( 默认: FALSE, 不关闭) */
virtual void SetTurnoffCongestCtrl ( BOOL bTurnOff ) = 0 ;
/* 设置数据刷新间隔( 毫秒, 默认: 60) */
virtual void SetFlushInterval ( DWORD dwFlushInterval ) = 0 ;
/* 设置快速重传 ACK 跨越次数( 默认: 0, 关闭快速重传) */
virtual void SetResendByAcks ( DWORD dwResendByAcks ) = 0 ;
/* 设置发送窗口大小( 数据包数量, 默认: 128) */
virtual void SetSendWndSize ( DWORD dwSendWndSize ) = 0 ;
/* 设置接收窗口大小( 数据包数量, 默认: 512) */
virtual void SetRecvWndSize ( DWORD dwRecvWndSize ) = 0 ;
/* 设置最小重传超时时间( 毫秒, 默认: 30) */
virtual void SetMinRto ( DWORD dwMinRto ) = 0 ;
/* 设置快速握手次数限制( 默认: 5, 如果为 0 则不限制) */
virtual void SetFastLimit ( DWORD dwFastLimit ) = 0 ;
/* 设置最大传输单元( 默认: 0, 与 SetMaxDatagramSize() 一致) */
virtual void SetMaxTransUnit ( DWORD dwMaxTransUnit ) = 0 ;
/* 设置最大数据包大小( 默认: 4096) */
virtual void SetMaxMessageSize ( DWORD dwMaxMessageSize ) = 0 ;
/* 设置握手超时时间( 毫秒, 默认: 5000) */
virtual void SetHandShakeTimeout ( DWORD dwHandShakeTimeout ) = 0 ;
/* 检测是否开启 nodelay 模式 */
virtual BOOL IsNoDelay ( ) = 0 ;
/* 检测是否关闭拥塞控制 */
virtual BOOL IsTurnoffCongestCtrl ( ) = 0 ;
/* 获取数据刷新间隔 */
virtual DWORD GetFlushInterval ( ) = 0 ;
/* 获取快速重传 ACK 跨越次数 */
virtual DWORD GetResendByAcks ( ) = 0 ;
/* 获取发送窗口大小 */
virtual DWORD GetSendWndSize ( ) = 0 ;
/* 获取接收窗口大小 */
virtual DWORD GetRecvWndSize ( ) = 0 ;
/* 获取最小重传超时时间 */
virtual DWORD GetMinRto ( ) = 0 ;
/* 获取快速握手次数限制 */
virtual DWORD GetFastLimit ( ) = 0 ;
/* 获取最大传输单元 */
virtual DWORD GetMaxTransUnit ( ) = 0 ;
/* 获取最大数据包大小 */
virtual DWORD GetMaxMessageSize ( ) = 0 ;
/* 获取握手超时时间 */
virtual DWORD GetHandShakeTimeout ( ) = 0 ;
/* 获取等待发送包数量 */
virtual BOOL GetWaitingSendMessageCount ( int & iCount ) = 0 ;
public :
virtual ~ IArqClient ( ) { }
2025-05-03 20:57:22 +08:00
} ;
/************************************************************************
名 称 : UDP ARQ 通 信 客 户 端 组 件 接 口
描 述 : 继 承 了 ARQ 和 Client 接 口
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
typedef DualInterface < IArqClient , IUdpClient > IUdpArqClient ;
# endif
/************************************************************************
名 称 : Server / Agent PULL 模 型 组 件 接 口
描 述 : 定 义 Server / Agent 组 件 的 PULL 模 型 组 件 的 所 有 操 作 方 法
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
class IPullSocket
{
public :
2025-10-15 04:32:59 +08:00
/*
* 名 称 : 抓 取 数 据
* 描 述 : 用 户 通 过 该 方 法 从 Socket 组 件 中 抓 取 数 据
*
* 参 数 : dwConnID - - 连 接 ID
* pData - - 抓 取 缓 冲 区
* iLength - - 抓 取 数 据 长 度
* 返 回 值 : EnFetchResult
*/
virtual EnFetchResult Fetch ( CONNID dwConnID , BYTE * pData , int iLength ) = 0 ;
/*
* 名 称 : 窥 探 数 据 ( 不 会 移 除 缓 冲 区 数 据 )
* 描 述 : 用 户 通 过 该 方 法 从 Socket 组 件 中 窥 探 数 据
*
* 参 数 : dwConnID - - 连 接 ID
* pData - - 窥 探 缓 冲 区
* iLength - - 窥 探 数 据 长 度
* 返 回 值 : EnFetchResult
*/
virtual EnFetchResult Peek ( CONNID dwConnID , BYTE * pData , int iLength ) = 0 ;
public :
virtual ~ IPullSocket ( ) { }
2025-05-03 20:57:22 +08:00
} ;
/************************************************************************
名 称 : Client PULL 模 型 组 件 接 口
描 述 : 定 义 Client 组 件 的 PULL 模 型 组 件 的 所 有 操 作 方 法
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
class IPullClient
{
public :
2025-10-15 04:32:59 +08:00
/*
* 名 称 : 抓 取 数 据
* 描 述 : 用 户 通 过 该 方 法 从 Socket 组 件 中 抓 取 数 据
*
* 参 数 : pData - - 抓 取 缓 冲 区
* iLength - - 抓 取 数 据 长 度
* 返 回 值 : EnFetchResult
*/
virtual EnFetchResult Fetch ( BYTE * pData , int iLength ) = 0 ;
/*
* 名 称 : 窥 探 数 据 ( 不 会 移 除 缓 冲 区 数 据 )
* 描 述 : 用 户 通 过 该 方 法 从 Socket 组 件 中 窥 探 数 据
*
* 参 数 : pData - - 窥 探 缓 冲 区
* iLength - - 窥 探 数 据 长 度
* 返 回 值 : EnFetchResult
*/
virtual EnFetchResult Peek ( BYTE * pData , int iLength ) = 0 ;
public :
virtual ~ IPullClient ( ) { }
2025-05-03 20:57:22 +08:00
} ;
/************************************************************************
名 称 : TCP PULL 模 型 组 件 接 口
描 述 : 继 承 了 PULL 和 Socket 接 口
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
typedef DualInterface < IPullSocket , ITcpServer > ITcpPullServer ;
typedef DualInterface < IPullSocket , ITcpAgent > ITcpPullAgent ;
typedef DualInterface < IPullClient , ITcpClient > ITcpPullClient ;
/************************************************************************
名 称 : Server / Agent PACK 模 型 组 件 接 口
描 述 : 定 义 Server / Agent 组 件 的 PACK 模 型 组 件 的 所 有 操 作 方 法
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
class IPackSocket
{
public :
2025-10-15 04:32:59 +08:00
/***********************************************************************/
/***************************** 属性访问方法 *****************************/
2025-05-03 20:57:22 +08:00
2025-10-15 04:32:59 +08:00
/* 设置数据包最大长度(有效数据包最大长度不能超过 4194303/0x3FFFFF 字节, 默认: 262144/0x40000) */
virtual void SetMaxPackSize ( DWORD dwMaxPackSize ) = 0 ;
/* 设置包头标识(有效包头标识取值范围 0 ~ 1023/0x3FF, 当包头标识为 0 时不校验包头, 默认: 0) */
virtual void SetPackHeaderFlag ( USHORT usPackHeaderFlag ) = 0 ;
2025-05-03 20:57:22 +08:00
2025-10-15 04:32:59 +08:00
/* 获取数据包最大长度 */
virtual DWORD GetMaxPackSize ( ) = 0 ;
/* 获取包头标识 */
virtual USHORT GetPackHeaderFlag ( ) = 0 ;
2025-05-03 20:57:22 +08:00
public :
2025-10-15 04:32:59 +08:00
virtual ~ IPackSocket ( ) { }
2025-05-03 20:57:22 +08:00
} ;
/************************************************************************
名 称 : Client PACK 模 型 组 件 接 口
描 述 : 定 义 Client 组 件 的 PACK 模 型 组 件 的 所 有 操 作 方 法
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
class IPackClient
{
public :
2025-10-15 04:32:59 +08:00
/***********************************************************************/
/***************************** 属性访问方法 *****************************/
2025-05-03 20:57:22 +08:00
2025-10-15 04:32:59 +08:00
/* 设置数据包最大长度(有效数据包最大长度不能超过 4194303/0x3FFFFF 字节, 默认: 262144/0x40000) */
virtual void SetMaxPackSize ( DWORD dwMaxPackSize ) = 0 ;
/* 设置包头标识(有效包头标识取值范围 0 ~ 1023/0x3FF, 当包头标识为 0 时不校验包头, 默认: 0) */
virtual void SetPackHeaderFlag ( USHORT usPackHeaderFlag ) = 0 ;
2025-05-03 20:57:22 +08:00
2025-10-15 04:32:59 +08:00
/* 获取数据包最大长度 */
virtual DWORD GetMaxPackSize ( ) = 0 ;
/* 获取包头标识 */
virtual USHORT GetPackHeaderFlag ( ) = 0 ;
2025-05-03 20:57:22 +08:00
public :
2025-10-15 04:32:59 +08:00
virtual ~ IPackClient ( ) { }
2025-05-03 20:57:22 +08:00
} ;
/************************************************************************
名 称 : TCP PACK 模 型 组 件 接 口
描 述 : 继 承 了 PACK 和 Socket 接 口
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
typedef DualInterface < IPackSocket , ITcpServer > ITcpPackServer ;
typedef DualInterface < IPackSocket , ITcpAgent > ITcpPackAgent ;
typedef DualInterface < IPackClient , ITcpClient > ITcpPackClient ;
/************************************************************************
名 称 : Socket 监 听 器 基 接 口
描 述 : 定 义 组 件 监 听 器 的 公 共 方 法
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
template < class T > class ISocketListenerT
{
public :
2025-10-15 04:32:59 +08:00
/*
* 名 称 : 握 手 完 成 通 知
* 描 述 : 连 接 完 成 握 手 时 , Socket 监 听 器 将 收 到 该 通 知 , 监 听 器 接 收 到 该 通 知 后 才 能 开 始
* 数 据 收 发 操 作
*
* 参 数 : pSender - - 事 件 源 对 象
* dwConnID - - 连 接 ID
* 返 回 值 : HR_OK / HR_IGNORE - - 继 续 执 行
* HR_ERROR - - 引 发 OnClose ( ) 事 件 并 关 闭 连 接
*/
virtual EnHandleResult OnHandShake ( T * pSender , CONNID dwConnID ) = 0 ;
/*
* 名 称 : 已 发 送 数 据 通 知
* 描 述 : 成 功 发 送 数 据 后 , Socket 监 听 器 将 收 到 该 通 知
*
* 参 数 : pSender - - 事 件 源 对 象
* dwConnID - - 连 接 ID
* pData - - 已 发 送 数 据 缓 冲 区
* iLength - - 已 发 送 数 据 长 度
* 返 回 值 : HR_OK / HR_IGNORE - - 继 续 执 行
* HR_ERROR - - 该 通 知 不 允 许 返 回 HR_ERROR ( 调 试 模 式 下 引 发 断 言 错 误 )
*/
virtual EnHandleResult OnSend ( T * pSender , CONNID dwConnID , const BYTE * pData , int iLength ) = 0 ;
/*
* 名 称 : 数 据 到 达 通 知 ( PUSH 模 型 )
* 描 述 : 对 于 PUSH 模 型 的 Socket 通 信 组 件 , 成 功 接 收 数 据 后 将 向 Socket 监 听 器 发 送 该 通 知
*
* 参 数 : pSender - - 事 件 源 对 象
* dwConnID - - 连 接 ID
* pData - - 已 接 收 数 据 缓 冲 区
* iLength - - 已 接 收 数 据 长 度
* 返 回 值 : HR_OK / HR_IGNORE - - 继 续 执 行
* HR_ERROR - - 引 发 OnClose ( ) 事 件 并 关 闭 连 接
*/
virtual EnHandleResult OnReceive ( T * pSender , CONNID dwConnID , const BYTE * pData , int iLength ) = 0 ;
/*
* 名 称 : 数 据 到 达 通 知 ( PULL 模 型 )
* 描 述 : 对 于 PULL 模 型 的 Socket 通 信 组 件 , 成 功 接 收 数 据 后 将 向 Socket 监 听 器 发 送 该 通 知
*
* 参 数 : pSender - - 事 件 源 对 象
* dwConnID - - 连 接 ID
* iLength - - 已 接 收 数 据 长 度
* 返 回 值 : HR_OK / HR_IGNORE - - 继 续 执 行
* HR_ERROR - - 引 发 OnClose ( ) 事 件 并 关 闭 连 接
*/
virtual EnHandleResult OnReceive ( T * pSender , CONNID dwConnID , int iLength ) = 0 ;
/*
* 名 称 : 通 信 错 误 通 知
* 描 述 : 通 信 发 生 错 误 后 , Socket 监 听 器 将 收 到 该 通 知 , 并 关 闭 连 接
*
* 参 数 : pSender - - 事 件 源 对 象
* dwConnID - - 连 接 ID
* enOperation - - Socket 操 作 类 型
* iErrorCode - - 错 误 代 码
* 返 回 值 : 忽 略 返 回 值
*/
virtual EnHandleResult OnClose ( T * pSender , CONNID dwConnID , EnSocketOperation enOperation , int iErrorCode ) = 0 ;
public :
virtual ~ ISocketListenerT ( ) { }
2025-05-03 20:57:22 +08:00
} ;
template < class T > class IComplexSocketListenerT : public ISocketListenerT < T >
{
public :
2025-10-15 04:32:59 +08:00
/*
* 名 称 : 关 闭 通 信 组 件 通 知
* 描 述 : 通 信 组 件 关 闭 时 , Socket 监 听 器 将 收 到 该 通 知
*
* 参 数 : pSender - - 事 件 源 对 象
* 返 回 值 : 忽 略 返 回 值
*/
virtual EnHandleResult OnShutdown ( T * pSender ) = 0 ;
2025-05-03 20:57:22 +08:00
} ;
/************************************************************************
名 称 : 服 务 端 Socket 监 听 器 接 口
描 述 : 定 义 服 务 端 Socket 监 听 器 的 所 有 事 件
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
template < class T > class IServerListenerT : public IComplexSocketListenerT < T >
{
public :
2025-10-15 04:32:59 +08:00
/*
* 名 称 : 准 备 监 听 通 知
* 描 述 : 通 信 服 务 端 组 件 启 动 时 , 在 监 听 Socket 创 建 完 成 并 开 始 执 行 监 听 前 , Socket 监 听
* 器 将 收 到 该 通 知 , 监 听 器 可 以 在 通 知 处 理 方 法 中 执 行 Socket 选 项 设 置 等 额 外 工 作
*
* 参 数 : pSender - - 事 件 源 对 象
* soListen - - 监 听 Socket
* 返 回 值 : HR_OK / HR_IGNORE - - 继 续 执 行
* HR_ERROR - - 终 止 启 动 通 信 服 务 组 件
*/
virtual EnHandleResult OnPrepareListen ( T * pSender , SOCKET soListen ) = 0 ;
/*
* 名 称 : 接 收 连 接 通 知
* 描 述 : 接 收 到 客 户 端 连 接 请 求 时 , Socket 监 听 器 将 收 到 该 通 知 , 监 听 器 可 以 在 通 知 处 理 方
* 法 中 执 行 Socket 选 项 设 置 或 拒 绝 客 户 端 连 接 等 额 外 工 作
*
* 参 数 : pSender - - 事 件 源 对 象
* dwConnID - - 连 接 ID
* soClient - - TCP : 客 户 端 Socket 句 柄 , UDP : 客 户 端 Socket SOCKADDR 指 针
* 返 回 值 : HR_OK / HR_IGNORE - - 接 受 连 接
* HR_ERROR - - 拒 绝 连 接
*/
virtual EnHandleResult OnAccept ( T * pSender , CONNID dwConnID , UINT_PTR soClient ) = 0 ;
2025-05-03 20:57:22 +08:00
} ;
/************************************************************************
名 称 : TCP 服 务 端 Socket 监 听 器 接 口
描 述 : 定 义 TCP 服 务 端 Socket 监 听 器 的 所 有 事 件
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
class ITcpServerListener : public IServerListenerT < ITcpServer >
{
public :
} ;
/************************************************************************
名 称 : PUSH 模 型 服 务 端 Socket 监 听 器 抽 象 基 类
描 述 : 定 义 某 些 事 件 的 默 认 处 理 方 法 ( 忽 略 事 件 )
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
class CTcpServerListener : public ITcpServerListener
{
public :
2025-10-15 04:32:59 +08:00
virtual EnHandleResult OnPrepareListen ( ITcpServer * pSender , SOCKET soListen )
{
return HR_IGNORE ;
}
virtual EnHandleResult OnAccept ( ITcpServer * pSender , CONNID dwConnID , UINT_PTR soClient )
{
return HR_IGNORE ;
}
virtual EnHandleResult OnHandShake ( ITcpServer * pSender , CONNID dwConnID )
{
return HR_IGNORE ;
}
virtual EnHandleResult OnReceive ( ITcpServer * pSender , CONNID dwConnID , int iLength )
{
return HR_IGNORE ;
}
virtual EnHandleResult OnSend ( ITcpServer * pSender , CONNID dwConnID , const BYTE * pData , int iLength )
{
return HR_IGNORE ;
}
virtual EnHandleResult OnShutdown ( ITcpServer * pSender )
{
return HR_IGNORE ;
}
2025-05-03 20:57:22 +08:00
} ;
/************************************************************************
名 称 : PULL 模 型 服 务 端 Socket 监 听 器 抽 象 基 类
描 述 : 定 义 某 些 事 件 的 默 认 处 理 方 法 ( 忽 略 事 件 )
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
class CTcpPullServerListener : public CTcpServerListener
{
public :
2025-10-15 04:32:59 +08:00
virtual EnHandleResult OnReceive ( ITcpServer * pSender , CONNID dwConnID , int iLength ) = 0 ;
virtual EnHandleResult OnReceive ( ITcpServer * pSender , CONNID dwConnID , const BYTE * pData , int iLength )
{
return HR_IGNORE ;
}
2025-05-03 20:57:22 +08:00
} ;
# ifdef _UDP_SUPPORT
/************************************************************************
名 称 : UDP 服 务 端 Socket 监 听 器 接 口
描 述 : 定 义 UDP 服 务 端 Socket 监 听 器 的 所 有 事 件
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
class IUdpServerListener : public IServerListenerT < IUdpServer >
{
public :
} ;
/************************************************************************
名 称 : UDP 服 务 端 Socket 监 听 器 抽 象 基 类
描 述 : 定 义 某 些 事 件 的 默 认 处 理 方 法 ( 忽 略 事 件 )
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
class CUdpServerListener : public IUdpServerListener
{
public :
2025-10-15 04:32:59 +08:00
virtual EnHandleResult OnPrepareListen ( IUdpServer * pSender , SOCKET soListen )
{
return HR_IGNORE ;
}
virtual EnHandleResult OnAccept ( IUdpServer * pSender , CONNID dwConnID , UINT_PTR pSockAddr )
{
return HR_IGNORE ;
}
virtual EnHandleResult OnHandShake ( IUdpServer * pSender , CONNID dwConnID )
{
return HR_IGNORE ;
}
virtual EnHandleResult OnReceive ( IUdpServer * pSender , CONNID dwConnID , int iLength )
{
return HR_IGNORE ;
}
virtual EnHandleResult OnSend ( IUdpServer * pSender , CONNID dwConnID , const BYTE * pData , int iLength )
{
return HR_IGNORE ;
}
virtual EnHandleResult OnShutdown ( IUdpServer * pSender )
{
return HR_IGNORE ;
}
2025-05-03 20:57:22 +08:00
} ;
# endif
/************************************************************************
名 称 : 通 信 代 理 Socket 监 听 器 接 口
描 述 : 定 义 通 信 代 理 Socket 监 听 器 的 所 有 事 件
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
template < class T > class IAgentListenerT : public IComplexSocketListenerT < T >
{
public :
2025-10-15 04:32:59 +08:00
/*
* 名 称 : 准 备 连 接 通 知
* 描 述 : 通 信 客 户 端 组 件 启 动 时 , 在 客 户 端 Socket 创 建 完 成 并 开 始 执 行 连 接 前 , Socket 监 听
* 器 将 收 到 该 通 知 , 监 听 器 可 以 在 通 知 处 理 方 法 中 执 行 Socket 选 项 设 置 等 额 外 工 作
*
* 参 数 : pSender - - 事 件 源 对 象
* dwConnID - - 连 接 ID
* socket - - 客 户 端 Socket
* 返 回 值 : HR_OK / HR_IGNORE - - 继 续 执 行
* HR_ERROR - - 终 止 启 动 通 信 客 户 端 组 件
*/
virtual EnHandleResult OnPrepareConnect ( T * pSender , CONNID dwConnID , SOCKET socket ) = 0 ;
/*
* 名 称 : 连 接 完 成 通 知
* 描 述 : 与 服 务 端 成 功 建 立 连 接 时 , Socket 监 听 器 将 收 到 该 通 知
*
* 参 数 : pSender - - 事 件 源 对 象
* dwConnID - - 连 接 ID
* 返 回 值 : HR_OK / HR_IGNORE - - 继 续 执 行
* HR_ERROR - - 同 步 连 接 : 终 止 启 动 通 信 客 户 端 组 件
* 异 步 连 接 : 关 闭 连 接
*/
virtual EnHandleResult OnConnect ( T * pSender , CONNID dwConnID ) = 0 ;
2025-05-03 20:57:22 +08:00
} ;
/************************************************************************
名 称 : TCP 通 信 代 理 Socket 监 听 器 接 口
描 述 : 定 义 TCP 通 信 代 理 Socket 监 听 器 的 所 有 事 件
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
class ITcpAgentListener : public IAgentListenerT < ITcpAgent >
{
public :
} ;
/************************************************************************
名 称 : PUSH 模 型 通 信 代 理 Socket 监 听 器 抽 象 基 类
描 述 : 定 义 某 些 事 件 的 默 认 处 理 方 法 ( 忽 略 事 件 )
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
class CTcpAgentListener : public ITcpAgentListener
{
public :
2025-10-15 04:32:59 +08:00
virtual EnHandleResult OnPrepareConnect ( ITcpAgent * pSender , CONNID dwConnID , SOCKET socket )
{
return HR_IGNORE ;
}
virtual EnHandleResult OnConnect ( ITcpAgent * pSender , CONNID dwConnID )
{
return HR_IGNORE ;
}
virtual EnHandleResult OnHandShake ( ITcpAgent * pSender , CONNID dwConnID )
{
return HR_IGNORE ;
}
virtual EnHandleResult OnReceive ( ITcpAgent * pSender , CONNID dwConnID , int iLength )
{
return HR_IGNORE ;
}
virtual EnHandleResult OnSend ( ITcpAgent * pSender , CONNID dwConnID , const BYTE * pData , int iLength )
{
return HR_IGNORE ;
}
virtual EnHandleResult OnShutdown ( ITcpAgent * pSender )
{
return HR_IGNORE ;
}
2025-05-03 20:57:22 +08:00
} ;
/************************************************************************
名 称 : PULL 通 信 代 理 Socket 监 听 器 抽 象 基 类
描 述 : 定 义 某 些 事 件 的 默 认 处 理 方 法 ( 忽 略 事 件 )
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
class CTcpPullAgentListener : public CTcpAgentListener
{
public :
2025-10-15 04:32:59 +08:00
virtual EnHandleResult OnReceive ( ITcpAgent * pSender , CONNID dwConnID , int iLength ) = 0 ;
virtual EnHandleResult OnReceive ( ITcpAgent * pSender , CONNID dwConnID , const BYTE * pData , int iLength )
{
return HR_IGNORE ;
}
2025-05-03 20:57:22 +08:00
} ;
/************************************************************************
名 称 : 客 户 端 Socket 监 听 器 接 口
描 述 : 定 义 客 户 端 Socket 监 听 器 的 所 有 事 件
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
template < class T > class IClientListenerT : public ISocketListenerT < T >
{
public :
2025-10-15 04:32:59 +08:00
/*
* 名 称 : 准 备 连 接 通 知
* 描 述 : 通 信 客 户 端 组 件 启 动 时 , 在 客 户 端 Socket 创 建 完 成 并 开 始 执 行 连 接 前 , Socket 监 听
* 器 将 收 到 该 通 知 , 监 听 器 可 以 在 通 知 处 理 方 法 中 执 行 Socket 选 项 设 置 等 额 外 工 作
*
* 参 数 : pSender - - 事 件 源 对 象
* dwConnID - - 连 接 ID
* socket - - 客 户 端 Socket
* 返 回 值 : HR_OK / HR_IGNORE - - 继 续 执 行
* HR_ERROR - - 终 止 启 动 通 信 客 户 端 组 件
*/
virtual EnHandleResult OnPrepareConnect ( T * pSender , CONNID dwConnID , SOCKET socket ) = 0 ;
/*
* 名 称 : 连 接 完 成 通 知
* 描 述 : 与 服 务 端 成 功 建 立 连 接 时 , Socket 监 听 器 将 收 到 该 通 知
*
* 参 数 : pSender - - 事 件 源 对 象
* dwConnID - - 连 接 ID
* 返 回 值 : HR_OK / HR_IGNORE - - 继 续 执 行
* HR_ERROR - - 同 步 连 接 : 终 止 启 动 通 信 客 户 端 组 件
* 异 步 连 接 : 关 闭 连 接
*/
virtual EnHandleResult OnConnect ( T * pSender , CONNID dwConnID ) = 0 ;
2025-05-03 20:57:22 +08:00
} ;
/************************************************************************
名 称 : TCP 客 户 端 Socket 监 听 器 接 口
描 述 : 定 义 TCP 客 户 端 Socket 监 听 器 的 所 有 事 件
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
class ITcpClientListener : public IClientListenerT < ITcpClient >
{
public :
} ;
/************************************************************************
名 称 : PUSH 模 型 客 户 端 Socket 监 听 器 抽 象 基 类
描 述 : 定 义 某 些 事 件 的 默 认 处 理 方 法 ( 忽 略 事 件 )
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
class CTcpClientListener : public ITcpClientListener
{
public :
2025-10-15 04:32:59 +08:00
virtual EnHandleResult OnPrepareConnect ( ITcpClient * pSender , CONNID dwConnID , SOCKET socket )
{
return HR_IGNORE ;
}
virtual EnHandleResult OnConnect ( ITcpClient * pSender , CONNID dwConnID )
{
return HR_IGNORE ;
}
virtual EnHandleResult OnHandShake ( ITcpClient * pSender , CONNID dwConnID )
{
return HR_IGNORE ;
}
virtual EnHandleResult OnReceive ( ITcpClient * pSender , CONNID dwConnID , int iLength )
{
return HR_IGNORE ;
}
virtual EnHandleResult OnSend ( ITcpClient * pSender , CONNID dwConnID , const BYTE * pData , int iLength )
{
return HR_IGNORE ;
}
2025-05-03 20:57:22 +08:00
} ;
/************************************************************************
名 称 : PULL 客 户 端 Socket 监 听 器 抽 象 基 类
描 述 : 定 义 某 些 事 件 的 默 认 处 理 方 法 ( 忽 略 事 件 )
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
class CTcpPullClientListener : public CTcpClientListener
{
public :
2025-10-15 04:32:59 +08:00
virtual EnHandleResult OnReceive ( ITcpClient * pSender , CONNID dwConnID , int iLength ) = 0 ;
virtual EnHandleResult OnReceive ( ITcpClient * pSender , CONNID dwConnID , const BYTE * pData , int iLength )
{
return HR_IGNORE ;
}
2025-05-03 20:57:22 +08:00
} ;
# ifdef _UDP_SUPPORT
/************************************************************************
名 称 : UDP 客 户 端 Socket 监 听 器 接 口
描 述 : 定 义 UDP 客 户 端 Socket 监 听 器 的 所 有 事 件
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
class IUdpClientListener : public IClientListenerT < IUdpClient >
{
public :
} ;
/************************************************************************
名 称 : UDP 户 端 Socket 监 听 器 抽 象 基 类
描 述 : 定 义 某 些 事 件 的 默 认 处 理 方 法 ( 忽 略 事 件 )
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
class CUdpClientListener : public IUdpClientListener
{
public :
2025-10-15 04:32:59 +08:00
virtual EnHandleResult OnPrepareConnect ( IUdpClient * pSender , CONNID dwConnID , SOCKET socket )
{
return HR_IGNORE ;
}
virtual EnHandleResult OnConnect ( IUdpClient * pSender , CONNID dwConnID )
{
return HR_IGNORE ;
}
virtual EnHandleResult OnHandShake ( IUdpClient * pSender , CONNID dwConnID )
{
return HR_IGNORE ;
}
virtual EnHandleResult OnReceive ( IUdpClient * pSender , CONNID dwConnID , int iLength )
{
return HR_IGNORE ;
}
virtual EnHandleResult OnSend ( IUdpClient * pSender , CONNID dwConnID , const BYTE * pData , int iLength )
{
return HR_IGNORE ;
}
2025-05-03 20:57:22 +08:00
} ;
/************************************************************************
名 称 : UDP 传 播 Socket 监 听 器 接 口
描 述 : 定 义 UDP 传 播 Socket 监 听 器 的 所 有 事 件
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
class IUdpCastListener : public IClientListenerT < IUdpCast >
{
public :
} ;
/************************************************************************
名 称 : UDP 传 播 Socket 监 听 器 抽 象 基 类
描 述 : 定 义 某 些 事 件 的 默 认 处 理 方 法 ( 忽 略 事 件 )
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
class CUdpCastListener : public IUdpCastListener
{
public :
2025-10-15 04:32:59 +08:00
virtual EnHandleResult OnPrepareConnect ( IUdpCast * pSender , CONNID dwConnID , SOCKET socket )
{
return HR_IGNORE ;
}
virtual EnHandleResult OnConnect ( IUdpCast * pSender , CONNID dwConnID )
{
return HR_IGNORE ;
}
virtual EnHandleResult OnHandShake ( IUdpCast * pSender , CONNID dwConnID )
{
return HR_IGNORE ;
}
virtual EnHandleResult OnReceive ( IUdpCast * pSender , CONNID dwConnID , int iLength )
{
return HR_IGNORE ;
}
virtual EnHandleResult OnSend ( IUdpCast * pSender , CONNID dwConnID , const BYTE * pData , int iLength )
{
return HR_IGNORE ;
}
2025-05-03 20:57:22 +08:00
} ;
/************************************************************************
名 称 : UDP 节 点 Socket 监 听 器 接 口
描 述 : 定 义 UDP 节 点 Socket 监 听 器 的 所 有 事 件
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
class IUdpNodeListener
{
public :
2025-10-15 04:32:59 +08:00
/*
* 名 称 : 准 备 监 听 通 知
* 描 述 : 通 信 组 件 启 动 时 , 在 监 听 Socket 创 建 完 成 并 开 始 执 行 监 听 前 , Socket 监 听 器
* 将 收 到 该 通 知 , 监 听 器 可 以 在 通 知 处 理 方 法 中 执 行 Socket 选 项 设 置 等 额 外 工 作
*
* 参 数 : pSender - - 事 件 源 对 象
* soListen - - 监 听 Socket
* 返 回 值 : HR_OK / HR_IGNORE - - 继 续 执 行
* HR_ERROR - - 终 止 启 动 通 信 服 务 组 件
*/
virtual EnHandleResult OnPrepareListen ( IUdpNode * pSender , SOCKET soListen ) = 0 ;
/*
* 名 称 : 已 发 送 数 据 通 知
* 描 述 : 成 功 发 送 数 据 后 , Socket 监 听 器 将 收 到 该 通 知
*
* 参 数 : pSender - - 事 件 源 对 象
* lpszRemoteAddress - - 远 程 地 址
* usRemotePort - - 远 程 端 口
* pData - - 已 发 送 数 据 缓 冲 区
* iLength - - 已 发 送 数 据 长 度
* 返 回 值 : 忽 略 返 回 值
*/
virtual EnHandleResult OnSend ( IUdpNode * pSender , LPCTSTR lpszRemoteAddress , USHORT usRemotePort , const BYTE * pData , int iLength ) = 0 ;
/*
* 名 称 : 数 据 到 达 通 知 ( PUSH 模 型 )
* 描 述 : 成 功 接 收 数 据 后 , Socket 监 听 器 将 收 到 该 通 知
*
* 参 数 : pSender - - 事 件 源 对 象
* lpszRemoteAddress - - 远 程 地 址
* usRemotePort - - 远 程 端 口
* pData - - 已 发 送 数 据 缓 冲 区
* iLength - - 已 发 送 数 据 长 度
* 返 回 值 : 忽 略 返 回 值
*/
virtual EnHandleResult OnReceive ( IUdpNode * pSender , LPCTSTR lpszRemoteAddress , USHORT usRemotePort , const BYTE * pData , int iLength ) = 0 ;
/*
* 名 称 : 通 信 错 误 通 知
* 描 述 : 通 信 发 生 错 误 后 , Socket 监 听 器 将 收 到 该 通 知
*
* 参 数 : pSender - - 事 件 源 对 象
* lpszRemoteAddress - - 远 程 地 址
* usRemotePort - - 远 程 端 口
* enOperation - - Socket 操 作 类 型
* iErrorCode - - 错 误 代 码
* pData - - 本 次 事 件 关 联 的 数 据 缓 冲 区
* iLength - - 本 次 事 件 关 联 的 数 据 长 度
* 返 回 值 : 忽 略 返 回 值
*/
virtual EnHandleResult OnError ( IUdpNode * pSender , EnSocketOperation enOperation , int iErrorCode , LPCTSTR lpszRemoteAddress , USHORT usRemotePort , const BYTE * pData , int iLength ) = 0 ;
/*
* 名 称 : 关 闭 通 信 组 件 通 知
* 描 述 : 通 信 组 件 关 闭 时 , Socket 监 听 器 将 收 到 该 通 知
*
* 参 数 : pSender - - 事 件 源 对 象
* 返 回 值 : 忽 略 返 回 值
*/
virtual EnHandleResult OnShutdown ( IUdpNode * pSender ) = 0 ;
public :
virtual ~ IUdpNodeListener ( ) { }
2025-05-03 20:57:22 +08:00
} ;
/************************************************************************
名 称 : UDP 节 点 Socket 监 听 器 抽 象 基 类
描 述 : 定 义 某 些 事 件 的 默 认 处 理 方 法 ( 忽 略 事 件 )
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
class CUdpNodeListener : public IUdpNodeListener
{
public :
2025-10-15 04:32:59 +08:00
virtual EnHandleResult OnPrepareListen ( IUdpNode * pSender , SOCKET soListen )
{
return HR_IGNORE ;
}
virtual EnHandleResult OnSend ( IUdpNode * pSender , LPCTSTR lpszRemoteAddress , USHORT usRemotePort , const BYTE * pData , int iLength )
{
return HR_IGNORE ;
}
virtual EnHandleResult OnShutdown ( IUdpNode * pSender )
{
return HR_IGNORE ;
}
2025-05-03 20:57:22 +08:00
} ;
# endif
/*****************************************************************************************************************************************************/
/****************************************************************** HTTP Interfaces ******************************************************************/
/*****************************************************************************************************************************************************/
# ifdef _HTTP_SUPPORT
/************************************************************************
名 称 : 复 合 Http 组 件 接 口
描 述 : 定 义 复 合 Http 组 件 的 所 有 操 作 方 法 和 属 性 访 问 方 法 , 复 合 Http 组 件 同 时 管 理 多 个 Http 连 接
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
class IComplexHttp
{
public :
2025-10-15 04:32:59 +08:00
/***********************************************************************/
/***************************** 组件操作方法 *****************************/
/*
* 名 称 : 启 动 HTTP 通 信
* 描 述 : 当 通 信 组 件 设 置 为 非 自 动 启 动 HTTP 通 信 时 , 需 要 调 用 本 方 法 启 动 HTTP 通 信
*
* 返 回 值 : TRUE - - 成 功
* FALSE - - 失 败 , 可 通 过 SYS_GetLastError ( ) 获 取 失 败 原 因
*/
virtual BOOL StartHttp ( CONNID dwConnID ) = 0 ;
/*
* 名 称 : 发 送 Chunked 数 据 分 片
* 描 述 : 向 对 端 发 送 Chunked 数 据 分 片
*
* 参 数 : dwConnID - - 连 接 ID
* pData - - Chunked 数 据 分 片
* iLength - - 数 据 分 片 长 度 ( 为 0 表 示 结 束 分 片 )
* lpszExtensions - - 扩 展 属 性 ( 默 认 : nullptr )
* 返 回 值 : TRUE - - 成 功
* FALSE - - 失 败
*/
virtual BOOL SendChunkData ( CONNID dwConnID , const BYTE * pData = nullptr , int iLength = 0 , LPCSTR lpszExtensions = nullptr ) = 0 ;
public :
/***********************************************************************/
/***************************** 属性访问方法 *****************************/
/* 设置本地协议版本 */
virtual void SetLocalVersion ( EnHttpVersion usVersion ) = 0 ;
/* 获取本地协议版本 */
virtual EnHttpVersion GetLocalVersion ( ) = 0 ;
/* 检查是否升级协议 */
virtual BOOL IsUpgrade ( CONNID dwConnID ) = 0 ;
/* 检查是否有 Keep-Alive 标识 */
virtual BOOL IsKeepAlive ( CONNID dwConnID ) = 0 ;
/* 获取协议版本 */
virtual USHORT GetVersion ( CONNID dwConnID ) = 0 ;
/* 获取内容长度 */
virtual ULONGLONG GetContentLength ( CONNID dwConnID ) = 0 ;
/* 获取内容类型 */
virtual LPCSTR GetContentType ( CONNID dwConnID ) = 0 ;
/* 获取内容编码 */
virtual LPCSTR GetContentEncoding ( CONNID dwConnID ) = 0 ;
/* 获取传输编码 */
virtual LPCSTR GetTransferEncoding ( CONNID dwConnID ) = 0 ;
/* 获取协议升级类型 */
virtual EnHttpUpgradeType GetUpgradeType ( CONNID dwConnID ) = 0 ;
/* 获取解析错误代码 */
virtual USHORT GetParseErrorCode ( CONNID dwConnID , LPCSTR * lpszErrorDesc = nullptr ) = 0 ;
/* 获取某个请求头(单值) */
virtual BOOL GetHeader ( CONNID dwConnID , LPCSTR lpszName , LPCSTR * lpszValue ) = 0 ;
/* 获取某个请求头(多值) */
virtual BOOL GetHeaders ( CONNID dwConnID , LPCSTR lpszName , LPCSTR lpszValue [ ] , DWORD & dwCount ) = 0 ;
/* 获取所有请求头 */
virtual BOOL GetAllHeaders ( CONNID dwConnID , THeader lpHeaders [ ] , DWORD & dwCount ) = 0 ;
/* 获取所有请求头名称 */
virtual BOOL GetAllHeaderNames ( CONNID dwConnID , LPCSTR lpszName [ ] , DWORD & dwCount ) = 0 ;
/* 获取 Cookie */
virtual BOOL GetCookie ( CONNID dwConnID , LPCSTR lpszName , LPCSTR * lpszValue ) = 0 ;
/* 获取所有 Cookie */
virtual BOOL GetAllCookies ( CONNID dwConnID , TCookie lpCookies [ ] , DWORD & dwCount ) = 0 ;
/*
// !! maybe implemented in future !! //
virtual BOOL GetParam ( CONNID dwConnID , LPCSTR lpszName , LPCSTR * lpszValue ) = 0 ;
virtual BOOL GetParams ( CONNID dwConnID , LPCSTR lpszName , LPCSTR lpszValue [ ] , DWORD & dwCount ) = 0 ;
virtual BOOL GetAllParams ( CONNID dwConnID , LPPARAM lpszParam [ ] , DWORD & dwCount ) = 0 ;
virtual BOOL GetAllParamNames ( CONNID dwConnID , LPCSTR lpszName [ ] , DWORD & dwCount ) = 0 ;
*/
/* 获取当前 WebSocket 消息状态,传入 nullptr 则不获取相应字段 */
virtual BOOL GetWSMessageState ( CONNID dwConnID , BOOL * lpbFinal , BYTE * lpiReserved , BYTE * lpiOperationCode , LPCBYTE * lpszMask , ULONGLONG * lpullBodyLen , ULONGLONG * lpullBodyRemain ) = 0 ;
/* 设置 HTTP 启动方式( 默认: TRUE, 自动启动) */
virtual void SetHttpAutoStart ( BOOL bAutoStart ) = 0 ;
/* 获取 HTTP 启动方式 */
virtual BOOL IsHttpAutoStart ( ) = 0 ;
public :
virtual ~ IComplexHttp ( ) { }
2025-05-03 20:57:22 +08:00
} ;
/************************************************************************
名 称 : 复 合 Http 请 求 者 组 件 接 口
描 述 : 定 义 复 合 Http 请 求 者 组 件 的 所 有 操 作 方 法 和 属 性 访 问 方 法
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
class IComplexHttpRequester : public IComplexHttp
{
public :
2025-10-15 04:32:59 +08:00
/***********************************************************************/
/***************************** 组件操作方法 *****************************/
/*
* 名 称 : 发 送 WebSocket 消 息
* 描 述 : 向 对 端 端 发 送 WebSocket 消 息
*
* 参 数 : dwConnID - - 连 接 ID
* bFinal - - 是 否 结 束 帧
* iReserved - - RSV1 / RSV2 / RSV3 各 1 位
* iOperationCode - - 操 作 码 : 0x0 - 0xF
* lpszMask - - 掩 码 ( nullptr 或 4 字 节 掩 码 , 如 果 为 nullptr 则 没 有 掩 码 )
* pData - - 消 息 体 数 据 缓 冲 区
* iLength - - 消 息 体 数 据 长 度
* ullBodyLen - - 消 息 总 长 度
* ullBodyLen = 0 - > 消 息 总 长 度 为 iLength
* ullBodyLen = iLength - > 消 息 总 长 度 为 ullBodyLen
* ullBodyLen > iLength - > 消 息 总 长 度 为 ullBodyLen , 后 续 消 息 体 长 度 为 ullBOdyLen - iLength , 后 续 消 息 体 通 过 底 层 方 法 Send ( ) / SendPackets ( ) 发 送
* ullBodyLen < iLength - > 错 误 参 数 , 发 送 失 败
* 返 回 值 : TRUE - - 成 功
* FALSE - - 失 败
*/
virtual BOOL SendWSMessage ( CONNID dwConnID , BOOL bFinal , BYTE iReserved , BYTE iOperationCode , const BYTE lpszMask [ 4 ] , const BYTE * pData = nullptr , int iLength = 0 , ULONGLONG ullBodyLen = 0 ) = 0 ;
/*
* 名 称 : 发 送 请 求
* 描 述 : 向 服 务 端 发 送 HTTP 请 求
*
* 参 数 : dwConnID - - 连 接 ID
* lpszMethod - - 请 求 方 法
* lpszPath - - 请 求 路 径
* lpHeaders - - 请 求 头
* iHeaderCount - - 请 求 头 数 量
* pBody - - 请 求 体
* iLength - - 请 求 体 长 度
* 返 回 值 : TRUE - - 成 功
* FALSE - - 失 败
*/
virtual BOOL SendRequest ( CONNID dwConnID , LPCSTR lpszMethod , LPCSTR lpszPath , const THeader lpHeaders [ ] = nullptr , int iHeaderCount = 0 , const BYTE * pBody = nullptr , int iLength = 0 ) = 0 ;
/*
* 名 称 : 发 送 本 地 文 件
* 描 述 : 向 指 定 连 接 发 送 4096 KB 以 下 的 小 文 件
*
* 参 数 : dwConnID - - 连 接 ID
* lpszFileName - - 文 件 路 径
* lpszMethod - - 请 求 方 法
* lpszPath - - 请 求 路 径
* lpHeaders - - 请 求 头
* iHeaderCount - - 请 求 头 数 量
* 返 回 值 : TRUE - - 成 功
* FALSE - - 失 败
*/
virtual BOOL SendLocalFile ( CONNID dwConnID , LPCSTR lpszFileName , LPCSTR lpszMethod , LPCSTR lpszPath , const THeader lpHeaders [ ] = nullptr , int iHeaderCount = 0 ) = 0 ;
/* 发送 POST 请求 */
virtual BOOL SendPost ( CONNID dwConnID , LPCSTR lpszPath , const THeader lpHeaders [ ] , int iHeaderCount , const BYTE * pBody , int iLength ) = 0 ;
/* 发送 PUT 请求 */
virtual BOOL SendPut ( CONNID dwConnID , LPCSTR lpszPath , const THeader lpHeaders [ ] , int iHeaderCount , const BYTE * pBody , int iLength ) = 0 ;
/* 发送 PATCH 请求 */
virtual BOOL SendPatch ( CONNID dwConnID , LPCSTR lpszPath , const THeader lpHeaders [ ] , int iHeaderCount , const BYTE * pBody , int iLength ) = 0 ;
/* 发送 GET 请求 */
virtual BOOL SendGet ( CONNID dwConnID , LPCSTR lpszPath , const THeader lpHeaders [ ] = nullptr , int iHeaderCount = 0 ) = 0 ;
/* 发送 DELETE 请求 */
virtual BOOL SendDelete ( CONNID dwConnID , LPCSTR lpszPath , const THeader lpHeaders [ ] = nullptr , int iHeaderCount = 0 ) = 0 ;
/* 发送 HEAD 请求 */
virtual BOOL SendHead ( CONNID dwConnID , LPCSTR lpszPath , const THeader lpHeaders [ ] = nullptr , int iHeaderCount = 0 ) = 0 ;
/* 发送 TRACE 请求 */
virtual BOOL SendTrace ( CONNID dwConnID , LPCSTR lpszPath , const THeader lpHeaders [ ] = nullptr , int iHeaderCount = 0 ) = 0 ;
/* 发送 OPTIONS 请求 */
virtual BOOL SendOptions ( CONNID dwConnID , LPCSTR lpszPath , const THeader lpHeaders [ ] = nullptr , int iHeaderCount = 0 ) = 0 ;
/* 发送 CONNECT 请求 */
virtual BOOL SendConnect ( CONNID dwConnID , LPCSTR lpszHost , const THeader lpHeaders [ ] = nullptr , int iHeaderCount = 0 ) = 0 ;
public :
/***********************************************************************/
/***************************** 属性访问方法 *****************************/
/* 获取 HTTP 状态码 */
virtual USHORT GetStatusCode ( CONNID dwConnID ) = 0 ;
/* 设置是否使用 Cookie( 默认: TRUE) */
virtual void SetUseCookie ( BOOL bUseCookie ) = 0 ;
/* 检查是否使用 Cookie */
virtual BOOL IsUseCookie ( ) = 0 ;
2025-05-03 20:57:22 +08:00
} ;
/************************************************************************
名 称 : 复 合 Http 响 应 者 组 件 接 口
描 述 : 定 义 复 合 Http 响 应 者 组 件 的 所 有 操 作 方 法 和 属 性 访 问 方 法
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
class IComplexHttpResponder : public IComplexHttp
{
public :
2025-10-15 04:32:59 +08:00
/***********************************************************************/
/***************************** 组件操作方法 *****************************/
/*
* 名 称 : 发 送 WebSocket 消 息
* 描 述 : 向 对 端 端 发 送 WebSocket 消 息
*
* 参 数 : dwConnID - - 连 接 ID
* bFinal - - 是 否 结 束 帧
* iReserved - - RSV1 / RSV2 / RSV3 各 1 位
* iOperationCode - - 操 作 码 : 0x0 - 0xF
* pData - - 消 息 体 数 据 缓 冲 区
* iLength - - 消 息 体 数 据 长 度
* ullBodyLen - - 消 息 总 长 度
* ullBodyLen = 0 - > 消 息 总 长 度 为 iLength
* ullBodyLen = iLength - > 消 息 总 长 度 为 ullBodyLen
* ullBodyLen > iLength - > 消 息 总 长 度 为 ullBodyLen , 后 续 消 息 体 长 度 为 ullBOdyLen - iLength , 后 续 消 息 体 通 过 底 层 方 法 Send ( ) / SendPackets ( ) 发 送
* ullBodyLen < iLength - > 错 误 参 数 , 发 送 失 败
* 返 回 值 : TRUE - - 成 功
* FALSE - - 失 败
*/
virtual BOOL SendWSMessage ( CONNID dwConnID , BOOL bFinal , BYTE iReserved , BYTE iOperationCode , const BYTE * pData = nullptr , int iLength = 0 , ULONGLONG ullBodyLen = 0 ) = 0 ;
/*
* 名 称 : 回 复 请 求
* 描 述 : 向 客 户 端 回 复 HTTP 请 求
*
* 参 数 : dwConnID - - 连 接 ID
* usStatusCode - - HTTP 状 态 码
* lpszDesc - - HTTP 状 态 描 述
* lpHeaders - - 回 复 请 求 头
* iHeaderCount - - 回 复 请 求 头 数 量
* pData - - 回 复 请 求 体
* iLength - - 回 复 请 求 体 长 度
* 返 回 值 : TRUE - - 成 功
* FALSE - - 失 败
*/
virtual BOOL SendResponse ( CONNID dwConnID , USHORT usStatusCode , LPCSTR lpszDesc = nullptr , const THeader lpHeaders [ ] = nullptr , int iHeaderCount = 0 , const BYTE * pData = nullptr , int iLength = 0 ) = 0 ;
/*
* 名 称 : 发 送 本 地 文 件
* 描 述 : 向 指 定 连 接 发 送 4096 KB 以 下 的 小 文 件
*
* 参 数 : dwConnID - - 连 接 ID
* lpszFileName - - 文 件 路 径
* usStatusCode - - HTTP 状 态 码
* lpszDesc - - HTTP 状 态 描 述
* lpHeaders - - 回 复 请 求 头
* iHeaderCount - - 回 复 请 求 头 数 量
* 返 回 值 : TRUE - - 成 功
* FALSE - - 失 败
*/
virtual BOOL SendLocalFile ( CONNID dwConnID , LPCSTR lpszFileName , USHORT usStatusCode = HSC_OK , LPCSTR lpszDesc = nullptr , const THeader lpHeaders [ ] = nullptr , int iHeaderCount = 0 ) = 0 ;
/*
* 名 称 : 释 放 连 接
* 描 述 : 把 连 接 放 入 释 放 队 列 , 等 待 某 个 时 间 ( 通 过 SetReleaseDelay ( ) 设 置 ) 关 闭 连 接
*
* 参 数 : dwConnID - - 连 接 ID
* 返 回 值 : TRUE - - 成 功
* FALSE - - 失 败
*/
virtual BOOL Release ( CONNID dwConnID ) = 0 ;
public :
/***********************************************************************/
/***************************** 属性访问方法 *****************************/
/* 获取主机 */
virtual LPCSTR GetHost ( CONNID dwConnID ) = 0 ;
/* 设置连接释放延时( 默认: 3000 毫秒) */
virtual void SetReleaseDelay ( DWORD dwReleaseDelay ) = 0 ;
/* 获取连接释放延时 */
virtual DWORD GetReleaseDelay ( ) = 0 ;
/* 获取请求行 URL 域掩码( URL 域参考: EnHttpUrlField) */
virtual USHORT GetUrlFieldSet ( CONNID dwConnID ) = 0 ;
/* 获取某个 URL 域值 */
virtual LPCSTR GetUrlField ( CONNID dwConnID , EnHttpUrlField enField ) = 0 ;
/* 获取请求方法 */
virtual LPCSTR GetMethod ( CONNID dwConnID ) = 0 ;
2025-05-03 20:57:22 +08:00
} ;
/************************************************************************
名 称 : 简 单 HTTP 组 件 接 口
描 述 : 定 义 简 单 HTTP 组 件 的 所 有 操 作 方 法 和 属 性 访 问 方 法
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
class IHttp
{
public :
2025-10-15 04:32:59 +08:00
/***********************************************************************/
/***************************** 组件操作方法 *****************************/
/*
* 名 称 : 发 送 WebSocket 消 息
* 描 述 : 向 对 端 端 发 送 WebSocket 消 息
*
* 参 数 : bFinal - - 是 否 结 束 帧
* iReserved - - RSV1 / RSV2 / RSV3 各 1 位
* iOperationCode - - 操 作 码 : 0x0 - 0xF
* lpszMask - - 掩 码 ( nullptr 或 4 字 节 掩 码 , 如 果 为 nullptr 则 没 有 掩 码 )
* pData - - 消 息 体 数 据 缓 冲 区
* iLength - - 消 息 体 数 据 长 度
* ullBodyLen - - 消 息 总 长 度
* ullBodyLen = 0 - > 消 息 总 长 度 为 iLength
* ullBodyLen = iLength - > 消 息 总 长 度 为 ullBodyLen
* ullBodyLen > iLength - > 消 息 总 长 度 为 ullBodyLen , 后 续 消 息 体 长 度 为 ullBOdyLen - iLength , 后 续 消 息 体 通 过 底 层 方 法 Send ( ) / SendPackets ( ) 发 送
* ullBodyLen < iLength - > 错 误 参 数 , 发 送 失 败
* 返 回 值 : TRUE - - 成 功
* FALSE - - 失 败
*/
virtual BOOL SendWSMessage ( BOOL bFinal , BYTE iReserved , BYTE iOperationCode , const BYTE lpszMask [ 4 ] , const BYTE * pData = nullptr , int iLength = 0 , ULONGLONG ullBodyLen = 0 ) = 0 ;
/*
* 名 称 : 启 动 HTTP 通 信
* 描 述 : 当 通 信 组 件 设 置 为 非 自 动 启 动 HTTP 通 信 时 , 需 要 调 用 本 方 法 启 动 HTTP 通 信
*
* 返 回 值 : TRUE - - 成 功
* FALSE - - 失 败 , 可 通 过 SYS_GetLastError ( ) 获 取 失 败 原 因
*/
virtual BOOL StartHttp ( ) = 0 ;
/*
* 名 称 : 发 送 Chunked 数 据 分 片
* 描 述 : 向 对 端 发 送 Chunked 数 据 分 片
*
* 参 数 : pData - - Chunked 数 据 分 片
* iLength - - 数 据 分 片 长 度 ( 为 0 表 示 结 束 分 片 )
* lpszExtensions - - 扩 展 属 性 ( 默 认 : nullptr )
* 返 回 值 : TRUE - - 成 功
* FALSE - - 失 败
*/
virtual BOOL SendChunkData ( const BYTE * pData = nullptr , int iLength = 0 , LPCSTR lpszExtensions = nullptr ) = 0 ;
public :
/***********************************************************************/
/***************************** 属性访问方法 *****************************/
/* 设置本地协议版本 */
virtual void SetLocalVersion ( EnHttpVersion usVersion ) = 0 ;
/* 获取本地协议版本 */
virtual EnHttpVersion GetLocalVersion ( ) = 0 ;
/* 检查是否升级协议 */
virtual BOOL IsUpgrade ( ) = 0 ;
/* 检查是否有 Keep-Alive 标识 */
virtual BOOL IsKeepAlive ( ) = 0 ;
/* 获取协议版本 */
virtual USHORT GetVersion ( ) = 0 ;
/* 获取内容长度 */
virtual ULONGLONG GetContentLength ( ) = 0 ;
/* 获取内容类型 */
virtual LPCSTR GetContentType ( ) = 0 ;
/* 获取内容编码 */
virtual LPCSTR GetContentEncoding ( ) = 0 ;
/* 获取传输编码 */
virtual LPCSTR GetTransferEncoding ( ) = 0 ;
/* 获取协议升级类型 */
virtual EnHttpUpgradeType GetUpgradeType ( ) = 0 ;
/* 获取解析错误代码 */
virtual USHORT GetParseErrorCode ( LPCSTR * lpszErrorDesc = nullptr ) = 0 ;
/* 获取 HTTP 状态码 */
virtual USHORT GetStatusCode ( ) = 0 ;
/* 获取某个请求头(单值) */
virtual BOOL GetHeader ( LPCSTR lpszName , LPCSTR * lpszValue ) = 0 ;
/* 获取某个请求头(多值) */
virtual BOOL GetHeaders ( LPCSTR lpszName , LPCSTR lpszValue [ ] , DWORD & dwCount ) = 0 ;
/* 获取所有请求头 */
virtual BOOL GetAllHeaders ( THeader lpHeaders [ ] , DWORD & dwCount ) = 0 ;
/* 获取所有请求头名称 */
virtual BOOL GetAllHeaderNames ( LPCSTR lpszName [ ] , DWORD & dwCount ) = 0 ;
/* 获取 Cookie */
virtual BOOL GetCookie ( LPCSTR lpszName , LPCSTR * lpszValue ) = 0 ;
/* 获取所有 Cookie */
virtual BOOL GetAllCookies ( TCookie lpCookies [ ] , DWORD & dwCount ) = 0 ;
/*
// !! maybe implemented in future !! //
virtual BOOL GetParam ( LPCSTR lpszName , LPCSTR * lpszValue ) = 0 ;
virtual BOOL GetParams ( LPCSTR lpszName , LPCSTR lpszValue [ ] , DWORD & dwCount ) = 0 ;
virtual BOOL GetAllParams ( LPPARAM lpszParam [ ] , DWORD & dwCount ) = 0 ;
virtual BOOL GetAllParamNames ( LPCSTR lpszName [ ] , DWORD & dwCount ) = 0 ;
*/
/* 获取当前 WebSocket 消息状态,传入 nullptr 则不获取相应字段 */
virtual BOOL GetWSMessageState ( BOOL * lpbFinal , BYTE * lpiReserved , BYTE * lpiOperationCode , LPCBYTE * lpszMask , ULONGLONG * lpullBodyLen , ULONGLONG * lpullBodyRemain ) = 0 ;
/* 设置 HTTP 启动方式( 默认: TRUE, 自动启动) */
virtual void SetHttpAutoStart ( BOOL bAutoStart ) = 0 ;
/* 获取 HTTP 启动方式 */
virtual BOOL IsHttpAutoStart ( ) = 0 ;
public :
virtual ~ IHttp ( ) { }
2025-05-03 20:57:22 +08:00
} ;
/************************************************************************
名 称 : 简 单 Http 请 求 者 组 件 接 口
描 述 : 定 义 简 单 Http 请 求 者 组 件 的 所 有 操 作 方 法 和 属 性 访 问 方 法
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
class IHttpRequester : public IHttp
{
public :
2025-10-15 04:32:59 +08:00
/***********************************************************************/
/***************************** 组件操作方法 *****************************/
/*
* 名 称 : 发 送 请 求
* 描 述 : 向 服 务 端 发 送 HTTP 请 求
*
* 参 数 : lpszMethod - - 请 求 方 法
* lpszPath - - 请 求 路 径
* lpHeaders - - 请 求 头
* iHeaderCount - - 请 求 头 数 量
* pBody - - 请 求 体
* iLength - - 请 求 体 长 度
* 返 回 值 : TRUE - - 成 功
* FALSE - - 失 败
*/
virtual BOOL SendRequest ( LPCSTR lpszMethod , LPCSTR lpszPath , const THeader lpHeaders [ ] = nullptr , int iHeaderCount = 0 , const BYTE * pBody = nullptr , int iLength = 0 ) = 0 ;
/*
* 名 称 : 发 送 本 地 文 件
* 描 述 : 向 指 定 连 接 发 送 4096 KB 以 下 的 小 文 件
*
* 参 数 : dwConnID - - 连 接 ID
* lpszFileName - - 文 件 路 径
* lpszMethod - - 请 求 方 法
* lpszPath - - 请 求 路 径
* lpHeaders - - 请 求 头
* iHeaderCount - - 请 求 头 数 量
* 返 回 值 : TRUE - - 成 功
* FALSE - - 失 败
*/
virtual BOOL SendLocalFile ( LPCSTR lpszFileName , LPCSTR lpszMethod , LPCSTR lpszPath , const THeader lpHeaders [ ] = nullptr , int iHeaderCount = 0 ) = 0 ;
/* 发送 POST 请求 */
virtual BOOL SendPost ( LPCSTR lpszPath , const THeader lpHeaders [ ] , int iHeaderCount , const BYTE * pBody , int iLength ) = 0 ;
/* 发送 PUT 请求 */
virtual BOOL SendPut ( LPCSTR lpszPath , const THeader lpHeaders [ ] , int iHeaderCount , const BYTE * pBody , int iLength ) = 0 ;
/* 发送 PATCH 请求 */
virtual BOOL SendPatch ( LPCSTR lpszPath , const THeader lpHeaders [ ] , int iHeaderCount , const BYTE * pBody , int iLength ) = 0 ;
/* 发送 GET 请求 */
virtual BOOL SendGet ( LPCSTR lpszPath , const THeader lpHeaders [ ] = nullptr , int iHeaderCount = 0 ) = 0 ;
/* 发送 DELETE 请求 */
virtual BOOL SendDelete ( LPCSTR lpszPath , const THeader lpHeaders [ ] = nullptr , int iHeaderCount = 0 ) = 0 ;
/* 发送 HEAD 请求 */
virtual BOOL SendHead ( LPCSTR lpszPath , const THeader lpHeaders [ ] = nullptr , int iHeaderCount = 0 ) = 0 ;
/* 发送 TRACE 请求 */
virtual BOOL SendTrace ( LPCSTR lpszPath , const THeader lpHeaders [ ] = nullptr , int iHeaderCount = 0 ) = 0 ;
/* 发送 OPTIONS 请求 */
virtual BOOL SendOptions ( LPCSTR lpszPath , const THeader lpHeaders [ ] = nullptr , int iHeaderCount = 0 ) = 0 ;
/* 发送 CONNECT 请求 */
virtual BOOL SendConnect ( LPCSTR lpszHost , const THeader lpHeaders [ ] = nullptr , int iHeaderCount = 0 ) = 0 ;
public :
/***********************************************************************/
/***************************** 属性访问方法 *****************************/
/* 设置是否使用 Cookie( 默认: TRUE) */
virtual void SetUseCookie ( BOOL bUseCookie ) = 0 ;
/* 检查是否使用 Cookie */
virtual BOOL IsUseCookie ( ) = 0 ;
2025-05-03 20:57:22 +08:00
} ;
/************************************************************************
名 称 : 简 单 Http 同 步 请 求 者 组 件 接 口
描 述 : 定 义 简 单 Http 同 步 请 求 者 组 件 的 所 有 操 作 方 法 和 属 性 访 问 方 法
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
class IHttpSyncRequester : public IHttpRequester
{
public :
2025-10-15 04:32:59 +08:00
/*
* 名 称 : 发 送 URL 请 求
* 描 述 : 向 服 务 端 发 送 HTTP URL 请 求
*
* 参 数 : lpszMethod - - 请 求 方 法
* lpszUrl - - 请 求 URL
* lpHeaders - - 请 求 头
* iHeaderCount - - 请 求 头 数 量
* pBody - - 请 求 体
* iLength - - 请 求 体 长 度
* bForceReconnect - - 强 制 重 新 连 接 ( 默 认 : FALSE , 当 请 求 URL 的 主 机 和 端 口 与 现 有 连 接 一 致 时 , 重 用 现 有 连 接 )
* 返 回 值 : TRUE - - 成 功
* FALSE - - 失 败
*/
virtual BOOL OpenUrl ( LPCSTR lpszMethod , LPCSTR lpszUrl , const THeader lpHeaders [ ] = nullptr , int iHeaderCount = 0 , const BYTE * pBody = nullptr , int iLength = 0 , BOOL bForceReconnect = FALSE ) = 0 ;
/***********************************************************************/
/***************************** 组件操作方法 *****************************/
/*
* 名 称 : 清 除 请 求 结 果
* 描 述 : 清 除 上 一 次 请 求 的 响 应 头 和 响 应 体 等 结 果 信 息 ( 该 方 法 会 在 每 次 发 送 请 求 前 自 动 调 用 )
*
* 参 数 :
* 返 回 值 : TRUE - - 成 功
* FALSE - - 失 败
*/
virtual BOOL CleanupRequestResult ( ) = 0 ;
public :
/***********************************************************************/
/***************************** 属性访问方法 *****************************/
/* 设置连接超时( 毫秒, 0: 系统默认超时, 默认: 5000) */
virtual void SetConnectTimeout ( DWORD dwConnectTimeout ) = 0 ;
/* 设置请求超时( 毫秒, 0: 无限等待, 默认: 10000) */
virtual void SetRequestTimeout ( DWORD dwRequestTimeout ) = 0 ;
/* 获取连接超时 */
virtual DWORD GetConnectTimeout ( ) = 0 ;
/* 获取请求超时 */
virtual DWORD GetRequestTimeout ( ) = 0 ;
/* 获取响应体 */
virtual BOOL GetResponseBody ( LPCBYTE * lpszBody , int * iLength ) = 0 ;
2025-05-03 20:57:22 +08:00
} ;
/************************************************************************
名 称 : HTTP 组 件 接 口
描 述 : 继 承 了 HTTP 和 Socket 接 口
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
typedef DualInterface < IComplexHttpResponder , ITcpServer > IHttpServer ;
typedef DualInterface < IComplexHttpRequester , ITcpAgent > IHttpAgent ;
typedef DualInterface < IHttpRequester , ITcpClient > IHttpClient ;
typedef DualInterface < IHttpSyncRequester , ITcpClient > IHttpSyncClient ;
/************************************************************************
名 称 : IComplexHttp 组 件 监 听 器 基 接 口
描 述 : 定 义 IComplexHttp 组 件 监 听 器 的 所 有 事 件
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
template < class T > class IHttpListenerT
{
public :
2025-10-15 04:32:59 +08:00
/*
* 名 称 : 开 始 解 析 通 知
* 描 述 : 开 始 解 析 HTTP 报 文 时 , 向 监 听 器 发 送 该 通 知
*
* 参 数 : pSender - - 事 件 源 对 象
* dwConnID - - 连 接 ID
* 返 回 值 : HPR_OK - - 继 续 执 行
* HPR_ERROR - - 引 发 OnParserError ( ) 和 OnClose ( ) 事 件 并 关 闭 连 接
*/
virtual EnHttpParseResult OnMessageBegin ( T * pSender , CONNID dwConnID ) = 0 ;
/*
* 名 称 : 请 求 行 解 析 完 成 通 知 ( 仅 用 于 HTTP 服 务 端 )
* 描 述 : 请 求 行 解 析 完 成 后 , 向 监 听 器 发 送 该 通 知
*
* 参 数 : pSender - - 事 件 源 对 象
* dwConnID - - 连 接 ID
* lpszMethod - - 请 求 方 法 名
* lpszUrl - - 请 求 行 中 的 URL 域
* 返 回 值 : HPR_OK - - 继 续 执 行
* HPR_ERROR - - 引 发 OnParserError ( ) 和 OnClose ( ) 事 件 并 关 闭 连 接
*/
virtual EnHttpParseResult OnRequestLine ( T * pSender , CONNID dwConnID , LPCSTR lpszMethod , LPCSTR lpszUrl ) = 0 ;
/*
* 名 称 : 状 态 行 解 析 完 成 通 知 ( 仅 用 于 HTTP 客 户 端 )
* 描 述 : 状 态 行 解 析 完 成 后 , 向 监 听 器 发 送 该 通 知
*
* 参 数 : pSender - - 事 件 源 对 象
* dwConnID - - 连 接 ID
* usStatusCode - - HTTP 状 态 码
* lpszDesc - - 状 态 描 述
* 返 回 值 : HPR_OK - - 继 续 执 行
* HPR_ERROR - - 引 发 OnParserError ( ) 和 OnClose ( ) 事 件 并 关 闭 连 接
*/
virtual EnHttpParseResult OnStatusLine ( T * pSender , CONNID dwConnID , USHORT usStatusCode , LPCSTR lpszDesc ) = 0 ;
/*
* 名 称 : 请 求 头 通 知
* 描 述 : 每 当 解 析 完 成 一 个 请 求 头 后 , 向 监 听 器 发 送 该 通 知
*
* 参 数 : pSender - - 事 件 源 对 象
* dwConnID - - 连 接 ID
* lpszName - - 请 求 头 名 称
* lpszValue - - 请 求 头 值
* 返 回 值 : HPR_OK - - 继 续 执 行
* HPR_ERROR - - 引 发 OnParserError ( ) 和 OnClose ( ) 事 件 并 关 闭 连 接
*/
virtual EnHttpParseResult OnHeader ( T * pSender , CONNID dwConnID , LPCSTR lpszName , LPCSTR lpszValue ) = 0 ;
/*
* 名 称 : 请 求 头 完 成 通 知
* 描 述 : 解 析 完 成 所 有 请 求 头 后 , 向 监 听 器 发 送 该 通 知
*
* 参 数 : pSender - - 事 件 源 对 象
* dwConnID - - 连 接 ID
* 返 回 值 : HPR_OK - - 继 续 执 行
* HPR_SKIP_BODY - - 跳 过 当 前 请 求 的 HTTP BODY
* HPR_UPGRADE - - 升 级 协 议
* HPR_ERROR - - 引 发 OnParserError ( ) 和 OnClose ( ) 事 件 并 关 闭 连 接
*/
virtual EnHttpParseResult OnHeadersComplete ( T * pSender , CONNID dwConnID ) = 0 ;
/*
* 名 称 : BODY 报 文 通 知
* 描 述 : 每 当 接 收 到 HTTP BODY 报 文 , 向 监 听 器 发 送 该 通 知
*
* 参 数 : pSender - - 事 件 源 对 象
* dwConnID - - 连 接 ID
* pData - - 数 据 缓 冲 区
* iLength - - 数 据 长 度
* 返 回 值 : HPR_OK - - 继 续 执 行
* HPR_ERROR - - 引 发 OnParserError ( ) 和 OnClose ( ) 事 件 并 关 闭 连 接
*/
virtual EnHttpParseResult OnBody ( T * pSender , CONNID dwConnID , const BYTE * pData , int iLength ) = 0 ;
/*
* 名 称 : Chunked 报 文 头 通 知
* 描 述 : 每 当 解 析 出 一 个 Chunked 报 文 头 , 向 监 听 器 发 送 该 通 知
*
* 参 数 : pSender - - 事 件 源 对 象
* dwConnID - - 连 接 ID
* iLength - - Chunked 报 文 体 数 据 长 度
* 返 回 值 : HPR_OK - - 继 续 执 行
* HPR_ERROR - - 引 发 OnParserError ( ) 和 OnClose ( ) 事 件 并 关 闭 连 接
*/
virtual EnHttpParseResult OnChunkHeader ( T * pSender , CONNID dwConnID , int iLength ) = 0 ;
/*
* 名 称 : Chunked 报 文 结 束 通 知
* 描 述 : 每 当 解 析 完 一 个 Chunked 报 文 , 向 监 听 器 发 送 该 通 知
*
* 参 数 : pSender - - 事 件 源 对 象
* dwConnID - - 连 接 ID
* 返 回 值 : HPR_OK - - 继 续 执 行
* HPR_ERROR - - 引 发 OnParserError ( ) 和 OnClose ( ) 事 件 并 关 闭 连 接
*/
virtual EnHttpParseResult OnChunkComplete ( T * pSender , CONNID dwConnID ) = 0 ;
/*
* 名 称 : 完 成 解 析 通 知
* 描 述 : 每 当 解 析 完 成 一 个 完 整 HTTP 报 文 , 向 监 听 器 发 送 该 通 知
*
* 参 数 : pSender - - 事 件 源 对 象
* dwConnID - - 连 接 ID
* 返 回 值 : HPR_OK - - 继 续 执 行
* HPR_ERROR - - 引 发 OnParserError ( ) 和 OnClose ( ) 事 件 并 关 闭 连 接
*/
virtual EnHttpParseResult OnMessageComplete ( T * pSender , CONNID dwConnID ) = 0 ;
/*
* 名 称 : 升 级 协 议 通 知
* 描 述 : 当 需 要 升 级 协 议 时 , 向 监 听 器 发 送 该 通 知
*
* 参 数 : pSender - - 事 件 源 对 象
* dwConnID - - 连 接 ID
* enUpgradeType - - 协 议 类 型
* 返 回 值 : HPR_OK - - 继 续 执 行
* HPR_ERROR - - 引 发 OnClose ( ) 事 件 并 关 闭 连 接
*/
virtual EnHttpParseResult OnUpgrade ( T * pSender , CONNID dwConnID , EnHttpUpgradeType enUpgradeType ) = 0 ;
/*
* 名 称 : 解 析 错 误 通 知
* 描 述 : 当 解 析 HTTP 报 文 错 误 时 , 向 监 听 器 发 送 该 通 知
*
* 参 数 : pSender - - 事 件 源 对 象
* dwConnID - - 连 接 ID
* iErrorCode - - 错 误 代 码
* lpszErrorDesc - - 错 误 描 述
* 返 回 值 : HPR_OK - - 继 续 执 行
* HPR_ERROR - - 引 发 OnClose ( ) 事 件 并 关 闭 连 接
*/
virtual EnHttpParseResult OnParseError ( T * pSender , CONNID dwConnID , int iErrorCode , LPCSTR lpszErrorDesc ) = 0 ;
/*
* 名 称 : WebSocket 数 据 包 头 通 知
* 描 述 : 当 解 析 WebSocket 数 据 包 头 时 , 向 监 听 器 发 送 该 通 知
*
* 参 数 : pSender - - 事 件 源 对 象
* dwConnID - - 连 接 ID
* bFinal - - 是 否 结 束 帧
* iReserved - - RSV1 / RSV2 / RSV3 各 1 位
* iOperationCode - - 操 作 码 : 0x0 - 0xF
* lpszMask - - 掩 码 ( nullptr 或 4 字 节 掩 码 , 如 果 为 nullptr 则 没 有 掩 码 )
* ullBodyLen - - 消 息 体 长 度
* 返 回 值 : HR_OK / HR_IGNORE - - 继 续 执 行
* HR_ERROR - - 引 发 OnClose ( ) 事 件 并 关 闭 连 接
*/
virtual EnHandleResult OnWSMessageHeader ( T * pSender , CONNID dwConnID , BOOL bFinal , BYTE iReserved , BYTE iOperationCode , const BYTE lpszMask [ 4 ] , ULONGLONG ullBodyLen ) = 0 ;
/*
* 名 称 : WebSocket 数 据 包 体 通 知
* 描 述 : 当 接 收 到 WebSocket 数 据 包 体 时 , 向 监 听 器 发 送 该 通 知
*
* 参 数 : pSender - - 事 件 源 对 象
* dwConnID - - 连 接 ID
* pData - - 消 息 体 数 据 缓 冲 区
* iLength - - 消 息 体 数 据 长 度
* 返 回 值 : HR_OK / HR_IGNORE - - 继 续 执 行
* HR_ERROR - - 引 发 OnClose ( ) 事 件 并 关 闭 连 接
*/
virtual EnHandleResult OnWSMessageBody ( T * pSender , CONNID dwConnID , const BYTE * pData , int iLength ) = 0 ;
/*
* 名 称 : WebSocket 数 据 包 完 成 通 知
* 描 述 : 当 完 整 接 收 一 个 WebSocket 数 据 包 时 , 向 监 听 器 发 送 该 通 知
*
* 参 数 : pSender - - 事 件 源 对 象
* dwConnID - - 连 接 ID
* 返 回 值 : HR_OK / HR_IGNORE - - 继 续 执 行
* HR_ERROR - - 引 发 OnClose ( ) 事 件 并 关 闭 连 接
*/
virtual EnHandleResult OnWSMessageComplete ( T * pSender , CONNID dwConnID ) = 0 ;
public :
virtual ~ IHttpListenerT ( ) { }
2025-05-03 20:57:22 +08:00
} ;
/************************************************************************
名 称 : IHttpServer 组 件 端 监 听 器 接 口
描 述 : 定 义 IHttpServer 监 听 器 的 所 有 事 件
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
class IHttpServerListener : public IHttpListenerT < IHttpServer > , public ITcpServerListener
{
public :
} ;
/************************************************************************
名 称 : IHttpAgent 组 件 端 监 听 器 接 口
描 述 : 定 义 IHttpAgent 监 听 器 的 所 有 事 件
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
class IHttpAgentListener : public IHttpListenerT < IHttpAgent > , public ITcpAgentListener
{
public :
} ;
/************************************************************************
名 称 : IHttpClient 组 件 端 监 听 器 接 口
描 述 : 定 义 IHttpClient 监 听 器 的 所 有 事 件
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
class IHttpClientListener : public IHttpListenerT < IHttpClient > , public ITcpClientListener
{
public :
} ;
/************************************************************************
名 称 : IHttpServerListener 监 听 器 抽 象 基 类
描 述 : 定 义 某 些 事 件 的 默 认 处 理 方 法 ( 忽 略 事 件 )
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
class CHttpServerListener : public IHttpServerListener
{
public :
2025-10-15 04:32:59 +08:00
virtual EnHandleResult OnPrepareListen ( ITcpServer * pSender , SOCKET soListen )
{
return HR_IGNORE ;
}
virtual EnHandleResult OnAccept ( ITcpServer * pSender , CONNID dwConnID , UINT_PTR soClient )
{
return HR_IGNORE ;
}
virtual EnHandleResult OnHandShake ( ITcpServer * pSender , CONNID dwConnID )
{
return HR_IGNORE ;
}
virtual EnHandleResult OnReceive ( ITcpServer * pSender , CONNID dwConnID , int iLength )
{
return HR_IGNORE ;
}
virtual EnHandleResult OnReceive ( ITcpServer * pSender , CONNID dwConnID , const BYTE * pData , int iLength )
{
return HR_IGNORE ;
}
virtual EnHandleResult OnSend ( ITcpServer * pSender , CONNID dwConnID , const BYTE * pData , int iLength )
{
return HR_IGNORE ;
}
virtual EnHandleResult OnShutdown ( ITcpServer * pSender )
{
return HR_IGNORE ;
}
virtual EnHttpParseResult OnMessageBegin ( IHttpServer * pSender , CONNID dwConnID )
{
return HPR_OK ;
}
virtual EnHttpParseResult OnRequestLine ( IHttpServer * pSender , CONNID dwConnID , LPCSTR lpszMethod , LPCSTR lpszUrl )
{
return HPR_OK ;
}
virtual EnHttpParseResult OnStatusLine ( IHttpServer * pSender , CONNID dwConnID , USHORT usStatusCode , LPCSTR lpszDesc )
{
return HPR_OK ;
}
virtual EnHttpParseResult OnHeader ( IHttpServer * pSender , CONNID dwConnID , LPCSTR lpszName , LPCSTR lpszValue )
{
return HPR_OK ;
}
virtual EnHttpParseResult OnChunkHeader ( IHttpServer * pSender , CONNID dwConnID , int iLength )
{
return HPR_OK ;
}
virtual EnHttpParseResult OnChunkComplete ( IHttpServer * pSender , CONNID dwConnID )
{
return HPR_OK ;
}
virtual EnHttpParseResult OnUpgrade ( IHttpServer * pSender , CONNID dwConnID , EnHttpUpgradeType enUpgradeType )
{
return HPR_OK ;
}
virtual EnHandleResult OnWSMessageHeader ( IHttpServer * pSender , CONNID dwConnID , BOOL bFinal , BYTE iReserved , BYTE iOperationCode , const BYTE lpszMask [ 4 ] , ULONGLONG ullBodyLen )
{
return HR_IGNORE ;
}
virtual EnHandleResult OnWSMessageBody ( IHttpServer * pSender , CONNID dwConnID , const BYTE * pData , int iLength )
{
return HR_IGNORE ;
}
virtual EnHandleResult OnWSMessageComplete ( IHttpServer * pSender , CONNID dwConnID )
{
return HR_IGNORE ;
}
2025-05-03 20:57:22 +08:00
} ;
/************************************************************************
名 称 : IHttpAgentListener 监 听 器 抽 象 基 类
描 述 : 定 义 某 些 事 件 的 默 认 处 理 方 法 ( 忽 略 事 件 )
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
class CHttpAgentListener : public IHttpAgentListener
{
public :
2025-10-15 04:32:59 +08:00
virtual EnHandleResult OnPrepareConnect ( ITcpAgent * pSender , CONNID dwConnID , SOCKET socket )
{
return HR_IGNORE ;
}
virtual EnHandleResult OnConnect ( ITcpAgent * pSender , CONNID dwConnID )
{
return HR_IGNORE ;
}
virtual EnHandleResult OnHandShake ( ITcpAgent * pSender , CONNID dwConnID )
{
return HR_IGNORE ;
}
virtual EnHandleResult OnReceive ( ITcpAgent * pSender , CONNID dwConnID , int iLength )
{
return HR_IGNORE ;
}
virtual EnHandleResult OnReceive ( ITcpAgent * pSender , CONNID dwConnID , const BYTE * pData , int iLength )
{
return HR_IGNORE ;
}
virtual EnHandleResult OnSend ( ITcpAgent * pSender , CONNID dwConnID , const BYTE * pData , int iLength )
{
return HR_IGNORE ;
}
virtual EnHandleResult OnShutdown ( ITcpAgent * pSender )
{
return HR_IGNORE ;
}
virtual EnHttpParseResult OnMessageBegin ( IHttpAgent * pSender , CONNID dwConnID )
{
return HPR_OK ;
}
virtual EnHttpParseResult OnRequestLine ( IHttpAgent * pSender , CONNID dwConnID , LPCSTR lpszMethod , LPCSTR lpszUrl )
{
return HPR_OK ;
}
virtual EnHttpParseResult OnStatusLine ( IHttpAgent * pSender , CONNID dwConnID , USHORT usStatusCode , LPCSTR lpszDesc )
{
return HPR_OK ;
}
virtual EnHttpParseResult OnHeader ( IHttpAgent * pSender , CONNID dwConnID , LPCSTR lpszName , LPCSTR lpszValue )
{
return HPR_OK ;
}
virtual EnHttpParseResult OnChunkHeader ( IHttpAgent * pSender , CONNID dwConnID , int iLength )
{
return HPR_OK ;
}
virtual EnHttpParseResult OnChunkComplete ( IHttpAgent * pSender , CONNID dwConnID )
{
return HPR_OK ;
}
virtual EnHttpParseResult OnUpgrade ( IHttpAgent * pSender , CONNID dwConnID , EnHttpUpgradeType enUpgradeType )
{
return HPR_OK ;
}
virtual EnHandleResult OnWSMessageHeader ( IHttpAgent * pSender , CONNID dwConnID , BOOL bFinal , BYTE iReserved , BYTE iOperationCode , const BYTE lpszMask [ 4 ] , ULONGLONG ullBodyLen )
{
return HR_IGNORE ;
}
virtual EnHandleResult OnWSMessageBody ( IHttpAgent * pSender , CONNID dwConnID , const BYTE * pData , int iLength )
{
return HR_IGNORE ;
}
virtual EnHandleResult OnWSMessageComplete ( IHttpAgent * pSender , CONNID dwConnID )
{
return HR_IGNORE ;
}
2025-05-03 20:57:22 +08:00
} ;
/************************************************************************
名 称 : IHttpClientListener 监 听 器 抽 象 基 类
描 述 : 定 义 某 些 事 件 的 默 认 处 理 方 法 ( 忽 略 事 件 )
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
class CHttpClientListener : public IHttpClientListener
{
public :
2025-10-15 04:32:59 +08:00
virtual EnHandleResult OnPrepareConnect ( ITcpClient * pSender , CONNID dwConnID , SOCKET socket )
{
return HR_IGNORE ;
}
virtual EnHandleResult OnConnect ( ITcpClient * pSender , CONNID dwConnID )
{
return HR_IGNORE ;
}
virtual EnHandleResult OnHandShake ( ITcpClient * pSender , CONNID dwConnID )
{
return HR_IGNORE ;
}
virtual EnHandleResult OnReceive ( ITcpClient * pSender , CONNID dwConnID , int iLength )
{
return HR_IGNORE ;
}
virtual EnHandleResult OnReceive ( ITcpClient * pSender , CONNID dwConnID , const BYTE * pData , int iLength )
{
return HR_IGNORE ;
}
virtual EnHandleResult OnSend ( ITcpClient * pSender , CONNID dwConnID , const BYTE * pData , int iLength )
{
return HR_IGNORE ;
}
virtual EnHttpParseResult OnMessageBegin ( IHttpClient * pSender , CONNID dwConnID )
{
return HPR_OK ;
}
virtual EnHttpParseResult OnRequestLine ( IHttpClient * pSender , CONNID dwConnID , LPCSTR lpszMethod , LPCSTR lpszUrl )
{
return HPR_OK ;
}
virtual EnHttpParseResult OnStatusLine ( IHttpClient * pSender , CONNID dwConnID , USHORT usStatusCode , LPCSTR lpszDesc )
{
return HPR_OK ;
}
virtual EnHttpParseResult OnHeader ( IHttpClient * pSender , CONNID dwConnID , LPCSTR lpszName , LPCSTR lpszValue )
{
return HPR_OK ;
}
virtual EnHttpParseResult OnChunkHeader ( IHttpClient * pSender , CONNID dwConnID , int iLength )
{
return HPR_OK ;
}
virtual EnHttpParseResult OnChunkComplete ( IHttpClient * pSender , CONNID dwConnID )
{
return HPR_OK ;
}
virtual EnHttpParseResult OnUpgrade ( IHttpClient * pSender , CONNID dwConnID , EnHttpUpgradeType enUpgradeType )
{
return HPR_OK ;
}
virtual EnHandleResult OnWSMessageHeader ( IHttpClient * pSender , CONNID dwConnID , BOOL bFinal , BYTE iReserved , BYTE iOperationCode , const BYTE lpszMask [ 4 ] , ULONGLONG ullBodyLen )
{
return HR_IGNORE ;
}
virtual EnHandleResult OnWSMessageBody ( IHttpClient * pSender , CONNID dwConnID , const BYTE * pData , int iLength )
{
return HR_IGNORE ;
}
virtual EnHandleResult OnWSMessageComplete ( IHttpClient * pSender , CONNID dwConnID )
{
return HR_IGNORE ;
}
2025-05-03 20:57:22 +08:00
} ;
/************************************************************************
名 称 : IHttpClientListener 监 听 器 抽 象 基 类
描 述 : 定 义 某 些 事 件 的 默 认 处 理 方 法 ( 忽 略 事 件 )
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
class CHttpSyncClientListener : public CHttpClientListener
{
public :
2025-10-15 04:32:59 +08:00
virtual EnHandleResult OnClose ( ITcpClient * pSender , CONNID dwConnID , EnSocketOperation enOperation , int iErrorCode )
{
return HR_IGNORE ;
}
virtual EnHttpParseResult OnHeadersComplete ( IHttpClient * pSender , CONNID dwConnID )
{
return HPR_OK ;
}
virtual EnHttpParseResult OnBody ( IHttpClient * pSender , CONNID dwConnID , const BYTE * pData , int iLength )
{
return HPR_OK ;
}
virtual EnHttpParseResult OnMessageComplete ( IHttpClient * pSender , CONNID dwConnID )
{
return HPR_OK ;
}
virtual EnHttpParseResult OnParseError ( IHttpClient * pSender , CONNID dwConnID , int iErrorCode , LPCSTR lpszErrorDesc )
{
return HPR_OK ;
}
2025-05-03 20:57:22 +08:00
} ;
# endif
/*****************************************************************************************************************************************************/
/************************************************************** Thread Pool Interfaces ***************************************************************/
/*****************************************************************************************************************************************************/
/************************************************************************
名 称 : 线 程 池 组 件 接 口
描 述 : 定 义 线 程 池 组 件 的 所 有 操 作 方 法 和 属 性 访 问 方 法
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
class IHPThreadPool
{
public :
2025-10-15 04:32:59 +08:00
/***********************************************************************/
/***************************** 组件操作方法 *****************************/
/*
* 名 称 : 启 动 线 程 池 组 件
* 描 述 :
*
* 参 数 : dwThreadCount - - 线 程 数 量 , ( 默 认 : 0 )
* > 0 - > dwThreadCount
* = 0 - > ( CPU核数 * 2 + 2 )
* < 0 - > ( CPU核数 * ( - dwThreadCount ) )
* dwMaxQueueSize - - 任 务 队 列 最 大 容 量 ( 默 认 : 0 , 不 限 制 )
* enRejectedPolicy - - 任 务 拒 绝 处 理 策 略
* TRP_CALL_FAIL ( 默 认 ) : 立 刻 返 回 失 败
* TRP_WAIT_FOR : 等 待 ( 直 到 成 功 、 超 时 或 线 程 池 关 闭 等 原 因 导 致 失 败 )
* TRP_CALLER_RUN : 调 用 者 线 程 直 接 执 行
* dwStackSize - - 线 程 堆 栈 空 间 大 小 ( 默 认 : 0 - > 操 作 系 统 默 认 )
* 返 回 值 : TRUE - - 成 功
* FALSE - - 失 败 , 可 通 过 SYS_GetLastError ( ) 获 取 错 误 代 码
*/
virtual BOOL Start ( DWORD dwThreadCount = 0 , DWORD dwMaxQueueSize = 0 , EnRejectedPolicy enRejectedPolicy = TRP_CALL_FAIL , DWORD dwStackSize = 0 ) = 0 ;
/*
* 名 称 : 关 闭 线 程 池 组 件
* 描 述 : 在 规 定 时 间 内 关 闭 线 程 池 组 件 , 如 果 工 作 线 程 在 最 大 等 待 时 间 内 未 能 正 常 关 闭 , 会 尝 试 强 制 关 闭 , 这 种 情 况 下 很 可 能 会 造 成 系 统 资 源 泄 漏
*
* 参 数 : dwMaxWait - - 最 大 等 待 时 间 ( 毫 秒 , 默 认 : INFINITE , 一 直 等 待 )
* 返 回 值 : TRUE - - 成 功
* FALSE - - 失 败 , 可 通 过 SYS_GetLastError ( ) 获 取 错 误 代 码
*/
virtual BOOL Stop ( DWORD dwMaxWait = INFINITE ) = 0 ;
/*
* 名 称 : 提 交 任 务
* 描 述 : 向 线 程 池 提 交 异 步 任 务
*
* 参 数 : fnTaskProc - - 任 务 处 理 函 数
* pvArg - - 任 务 参 数
* dwMaxWait - - 任 务 提 交 最 大 等 待 时 间 ( 仅 对 TRP_WAIT_FOR 类 型 线 程 池 生 效 , 默 认 : INFINITE , 一 直 等 待 )
* 返 回 值 : TRUE - - 成 功
* FALSE - - 失 败 , 可 通 过 SYS_GetLastError ( ) 获 取 错 误 代 码
* 其 中 , 错 误 码 ERROR_DESTINATION_ELEMENT_FULL 表 示 任 务 队 列 已 满
*/
virtual BOOL Submit ( Fn_TaskProc fnTaskProc , PVOID pvArg , DWORD dwMaxWait = INFINITE ) = 0 ;
/*
* 名 称 : 提 交 Socket 任 务
* 描 述 : 向 线 程 池 提 交 异 步 Socket 任 务
*
* 参 数 : pTask - - 任 务 参 数
* dwMaxWait - - 任 务 提 交 最 大 等 待 时 间 ( 仅 对 TRP_WAIT_FOR 类 型 线 程 池 生 效 , 默 认 : INFINITE , 一 直 等 待 )
* 返 回 值 : TRUE - - 成 功
* FALSE - - 失 败 , 可 通 过 SYS_GetLastError ( ) 获 取 错 误 代 码
* 其 中 , 错 误 码 ERROR_DESTINATION_ELEMENT_FULL 表 示 任 务 队 列 已 满
* 注 意 : 如 果 提 交 失 败 , 需 要 手 工 调 用 Destroy_HP_SocketTaskObj ( ) 销 毁 TSocketTask 对 象
*/
virtual BOOL Submit ( LPTSocketTask pTask , DWORD dwMaxWait = INFINITE ) = 0 ;
/*
* 名 称 : 调 整 线 程 池 大 小
* 描 述 : 增 加 或 减 少 线 程 池 的 工 作 线 程 数 量
*
* 参 数 : dwNewThreadCount - - 线 程 数 量
* > 0 - > dwNewThreadCount
* = 0 - > ( CPU核数 * 2 + 2 )
* < 0 - > ( CPU核数 * ( - dwNewThreadCount ) )
* 返 回 值 : TRUE - - 成 功
* FALSE - - 失 败 , 可 通 过 SYS_GetLastError ( ) 获 取 错 误 代 码
*/
virtual BOOL AdjustThreadCount ( DWORD dwNewThreadCount ) = 0 ;
/*
* 名 称 : 等 待
* 描 述 : 等 待 线 程 池 组 件 停 止 运 行
*
* 参 数 : dwMilliseconds - - 超 时 时 间 ( 毫 秒 , 默 认 : - 1 , 永 不 超 时 )
* 返 回 值 : TRUE - - 成 功
* FALSE - - 失 败 , 可 通 过 SYS_GetLastError ( ) 获 取 错 误 代 码
*/
virtual BOOL Wait ( DWORD dwMilliseconds = INFINITE ) = 0 ;
public :
/***********************************************************************/
/***************************** 属性访问方法 *****************************/
/* 检查线程池组件是否已启动 */
virtual BOOL HasStarted ( ) = 0 ;
/* 查看线程池组件当前状态 */
virtual EnServiceState GetState ( ) = 0 ;
/* 获取当前任务等待队列大小 */
virtual DWORD GetQueueSize ( ) = 0 ;
/* 获取当前正在执行的任务数量 */
virtual DWORD GetTaskCount ( ) = 0 ;
/* 获取工作线程数量 */
virtual DWORD GetThreadCount ( ) = 0 ;
/* 获取任务队列最大容量 */
virtual DWORD GetMaxQueueSize ( ) = 0 ;
/* 获取任务拒绝处理策略 */
virtual EnRejectedPolicy GetRejectedPolicy ( ) = 0 ;
public :
virtual ~ IHPThreadPool ( ) { } ;
2025-05-03 20:57:22 +08:00
} ;
/************************************************************************
名 称 : 线 程 池 监 听 器 接 口
描 述 : 定 义 线 程 池 监 听 器 的 所 有 事 件
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
class IHPThreadPoolListener
{
public :
2025-10-15 04:32:59 +08:00
/*
* 名 称 : 线 程 池 启 动 通 知
* 描 述 : 线 程 池 启 动 时 监 听 器 将 收 到 该 通 知 , 监 听 器 可 以 在 通 知 处 理 方 法 中 执 行 预 处 理 工 作
*
* 参 数 : pThreadPool - - 线 程 池 对 象
* 返 回 值 : 无
*/
virtual void OnStartup ( IHPThreadPool * pThreadPool ) = 0 ;
/*
* 名 称 : 线 程 池 启 动 关 闭 通 知
* 描 述 : 线 程 池 关 闭 时 监 听 器 将 收 到 该 通 知 , 监 听 器 可 以 在 通 知 处 理 方 法 中 执 行 后 处 理 工 作
*
* 参 数 : pThreadPool - - 线 程 池 对 象
* 返 回 值 : 无
*/
virtual void OnShutdown ( IHPThreadPool * pThreadPool ) = 0 ;
/*
* 名 称 : 工 作 线 程 启 动 通 知
* 描 述 : 工 作 线 程 启 动 时 监 听 器 将 收 到 该 通 知 , 监 听 器 可 以 在 通 知 处 理 方 法 中 执 行 线 程 级 别 预 处 理 工 作
*
* 参 数 : pThreadPool - - 线 程 池 对 象
* dwThreadID - - 工 作 线 程 ID
* 返 回 值 : 无
*/
virtual void OnWorkerThreadStart ( IHPThreadPool * pThreadPool , THR_ID dwThreadID ) = 0 ;
/*
* 名 称 : 工 作 线 程 退 出 通 知
* 描 述 : 工 作 线 程 退 出 时 监 听 器 将 收 到 该 通 知 , 监 听 器 可 以 在 通 知 处 理 方 法 中 执 行 线 程 级 别 后 处 理 工 作
*
* 参 数 : pThreadPool - - 线 程 池 对 象
* dwThreadID - - 工 作 线 程 ID
* 返 回 值 : 无
*/
virtual void OnWorkerThreadEnd ( IHPThreadPool * pThreadPool , THR_ID dwThreadID ) = 0 ;
public :
virtual ~ IHPThreadPoolListener ( ) { } ;
2025-05-03 20:57:22 +08:00
} ;
/************************************************************************
名 称 : 线 程 池 监 听 器 抽 象 基 类
描 述 : 定 义 某 些 事 件 的 默 认 处 理 方 法 ( 忽 略 事 件 )
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
class CHPThreadPoolListener : public IHPThreadPoolListener
{
public :
2025-10-15 04:32:59 +08:00
virtual void OnStartup ( IHPThreadPool * pThreadPool ) { }
virtual void OnShutdown ( IHPThreadPool * pThreadPool ) { }
virtual void OnWorkerThreadStart ( IHPThreadPool * pThreadPool , THR_ID dwThreadID ) { }
virtual void OnWorkerThreadEnd ( IHPThreadPool * pThreadPool , THR_ID dwThreadID ) { }
2025-05-03 20:57:22 +08:00
} ;
/************************************************************************
名 称 : 压 缩 器 接 口
描 述 : 定 义 压 缩 器 的 所 有 操 作 方 法 和 属 性 访 问 方 法
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
class IHPCompressor
{
public :
2025-10-15 04:32:59 +08:00
/***********************************************************************/
/***************************** 组件操作方法 *****************************/
/*
* 名 称 : 执 行 压 缩
* 描 述 : 可 循 环 调 用 以 压 缩 流 式 或 分 段 数 据
*
* 参 数 : pData - - 待 压 缩 数 据 缓 冲 区
* iLength - - 待 压 缩 数 据 长 度
* bLast - - 是 否 最 后 一 段 待 压 缩 数 据
* pContext - - 压 缩 回 调 函 数 Fn_CompressDataCallback 的 上 下 文 参 数
*
* 返 回 值 : TRUE - - 成 功
* FALSE - - 失 败 , 可 通 过 SYS_GetLastError ( ) 获 取 错 误 代 码
*/
virtual BOOL Process ( const BYTE * pData , int iLength , BOOL bLast , PVOID pContext = nullptr ) = 0 ;
/*
* 名 称 : 执 行 压 缩
* 描 述 : 可 循 环 调 用 以 压 缩 流 式 或 分 段 数 据
*
* 参 数 : pData - - 待 压 缩 数 据 缓 冲 区
* iLength - - 待 压 缩 数 据 长 度
* bLast - - 是 否 最 后 一 段 待 压 缩 数 据
* bFlush - - 是 否 强 制 刷 新 ( 强 制 刷 新 会 降 低 压 缩 效 率 , 但 可 对 数 据 进 行 分 段 压 缩 )
* pContext - - 压 缩 回 调 函 数 Fn_CompressDataCallback 的 上 下 文 参 数
*
* 返 回 值 : TRUE - - 成 功
* FALSE - - 失 败 , 可 通 过 SYS_GetLastError ( ) 获 取 错 误 代 码
*/
virtual BOOL ProcessEx ( const BYTE * pData , int iLength , BOOL bLast , BOOL bFlush = FALSE , PVOID pContext = nullptr ) = 0 ;
/* 重置压缩器 */
virtual BOOL Reset ( ) = 0 ;
/***********************************************************************/
/***************************** 属性访问方法 *****************************/
/* 检测压缩器是否可用 */
virtual BOOL IsValid ( ) = 0 ;
public :
virtual ~ IHPCompressor ( ) { } ;
2025-05-03 20:57:22 +08:00
} ;
/************************************************************************
名 称 : 解 压 器 接 口
描 述 : 定 义 解 压 器 的 所 有 操 作 方 法 和 属 性 访 问 方 法
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
class IHPDecompressor
{
public :
2025-10-15 04:32:59 +08:00
/***********************************************************************/
/***************************** 组件操作方法 *****************************/
2025-05-03 20:57:22 +08:00
2025-10-15 04:32:59 +08:00
/*
* 名 称 : 执 行 解 压
* 描 述 : 可 循 环 调 用 以 解 压 流 式 或 分 段 数 据
*
* 参 数 : pData - - 待 解 压 数 据 缓 冲 区
* iLength - - 待 解 压 数 据 长 度
* pContext - - 解 压 回 调 函 数 Fn_DecompressDataCallback 的 上 下 文 参 数
*
* 返 回 值 : TRUE - - 成 功
* FALSE - - 失 败 , 可 通 过 SYS_GetLastError ( ) 获 取 错 误 代 码
*/
virtual BOOL Process ( const BYTE * pData , int iLength , PVOID pContext = nullptr ) = 0 ;
2025-05-03 20:57:22 +08:00
2025-10-15 04:32:59 +08:00
/* 重置解压器 */
virtual BOOL Reset ( ) = 0 ;
2025-05-03 20:57:22 +08:00
public :
2025-10-15 04:32:59 +08:00
/***********************************************************************/
/***************************** 属性访问方法 *****************************/
2025-05-03 20:57:22 +08:00
2025-10-15 04:32:59 +08:00
/* 检测解压器是否可用 */
virtual BOOL IsValid ( ) = 0 ;
2025-05-03 20:57:22 +08:00
public :
2025-10-15 04:32:59 +08:00
virtual ~ IHPDecompressor ( ) { } ;
2025-05-03 20:57:22 +08:00
} ;