hp-socket/include/hpsocket/SocketInterface.h

3124 lines
131 KiB
C
Raw Permalink Normal View History

2025-10-24 20:41:49 +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.
*/
#pragma once
#include "HPTypeDef.h"
/*****************************************************************************************************************************************************/
/***************************************************************** TCP/UDP Interfaces ****************************************************************/
/*****************************************************************************************************************************************************/
/************************************************************************
************************************************************************/
#if defined(__arm__) && defined(__GNUC__) && !(defined(__clang__) || defined(__llvm__))
#define __DUAL_VPTR_GAP__ sizeof(PVOID)
class __IFakeDualInterface__
{
public:
virtual ~__IFakeDualInterface__() {}
};
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:
/* 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() = default;
};
/************************************************************************
Socket
Socket 访 Socket Socket
************************************************************************/
class IComplexSocket
{
public:
/***********************************************************************/
/***************************** 组件操作方法 *****************************/
/*
*
*
*
*
* 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;
/* 设置数据发送策略(对 Linux 平台组件无效) */
virtual void SetSendPolicy (EnSendPolicy enSendPolicy) = 0;
/* 设置 OnSend 事件同步策略(对 Linux 平台组件无效) */
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;
/* 获取数据发送策略(对 Linux 平台组件无效) */
virtual EnSendPolicy GetSendPolicy () = 0;
/* 获取 OnSend 事件同步策略(对 Linux 平台组件无效) */
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() = default;
};
/************************************************************************
访
************************************************************************/
class IServer : public IComplexSocket
{
public:
/***********************************************************************/
/***************************** 组件操作方法 *****************************/
/*
*
*
*
* lpszBindAddress --
* usPort --
* TRUE --
* FALSE -- GetLastError()
*/
virtual BOOL Start (LPCTSTR lpszBindAddress, USHORT usPort) = 0;
public:
/***********************************************************************/
/***************************** 属性访问方法 *****************************/
/* 获取监听 Socket 的地址信息 */
virtual BOOL GetListenAddress(TCHAR lpszAddress[], int& iAddressLen, USHORT& usPort) = 0;
/* 设置是否开启 IPv4/IPv6 双栈默认TRUE */
virtual void SetDualStack(BOOL bDualStack) = 0;
/* 检测是否开启 IPv4/IPv6 双栈 */
virtual BOOL IsDualStack() = 0;
};
/************************************************************************
TCP
TCP 访
************************************************************************/
class ITcpServer : public IServer
{
public:
/***********************************************************************/
/***************************** 组件操作方法 *****************************/
/*
*
* 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;
#ifdef _SSL_SUPPORT
/*
* 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;
#endif
public:
/***********************************************************************/
/***************************** 属性访问方法 *****************************/
/* 设置 EPOLL 等待事件的最大数量 */
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;
/* 获取 EPOLL 等待事件的最大数量 */
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;
#ifdef _SSL_SUPPORT
/* 设置通信组件握手方式默认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;
#endif
};
#ifdef _UDP_SUPPORT
/************************************************************************
UDP
UDP 访
************************************************************************/
class IUdpServer : public IServer
{
public:
/***********************************************************************/
/***************************** 组件操作方法 *****************************/
public:
/***********************************************************************/
/***************************** 属性访问方法 *****************************/
/* 设置数据报文最大长度(建议在局域网环境下不超过 1432 字节,在广域网环境下不超过 548 字节) */
virtual void SetMaxDatagramSize (DWORD dwMaxDatagramSize) = 0;
/* 获取数据报文最大长度 */
virtual DWORD GetMaxDatagramSize () = 0;
/* 设置 Receive 预投递数量根据负载调整设置Receive 预投递数量越大则丢包概率越小) */
virtual void SetPostReceiveCount (DWORD dwPostReceiveCount) = 0;
/* 获取 Receive 预投递数量 */
virtual DWORD GetPostReceiveCount () = 0;
/* 设置监测包尝试次数0 则不发送监测跳包,如果超过最大尝试次数则认为已断线) */
virtual void SetDetectAttempts (DWORD dwDetectAttempts) = 0;
/* 设置监测包发送间隔毫秒0 不发送监测包) */
virtual void SetDetectInterval (DWORD dwDetectInterval) = 0;
/* 获取心跳检查次数 */
virtual DWORD GetDetectAttempts () = 0;
/* 获取心跳检查间隔 */
virtual DWORD GetDetectInterval () = 0;
};
/************************************************************************
Server/Agent ARQ
Server/Agent ARQ
************************************************************************/
class IArqSocket
{
public:
/***********************************************************************/
/***************************** 组件操作方法 *****************************/
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() = default;
};
/************************************************************************
UDP ARQ
ARQ Server
************************************************************************/
typedef DualInterface<IArqSocket, IUdpServer> IUdpArqServer;
#endif
/************************************************************************
访
************************************************************************/
class IAgent : public IComplexSocket
{
public:
/***********************************************************************/
/***************************** 组件操作方法 *****************************/
/*
*
*
*
* lpszBindAddress -- nullptr
* bAsyncConnect -- Connect
* TRUE --
* FALSE -- GetLastError()
*/
virtual BOOL Start (LPCTSTR lpszBindAddress = nullptr, BOOL bAsyncConnect = TRUE) = 0;
/*
*
* IAgentListener OnConnect() / OnHandShake()
*
* lpszRemoteAddress --
* usPort --
* pdwConnID -- IDnullptr 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;
};
/************************************************************************
TCP
TCP 访
************************************************************************/
class ITcpAgent : public IAgent
{
public:
/***********************************************************************/
/***************************** 组件操作方法 *****************************/
/*
*
* 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;
#ifdef _SSL_SUPPORT
/*
* 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;
#endif
public:
/***********************************************************************/
/***************************** 属性访问方法 *****************************/
/* 设置同步连接超时时间(毫秒) */
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;
#ifdef _SSL_SUPPORT
/* 设置通信组件握手方式默认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;
#endif
};
/************************************************************************
访
************************************************************************/
class IClient
{
public:
/***********************************************************************/
/***************************** 组件操作方法 *****************************/
/*
*
*
*
* lpszRemoteAddress --
* usPort --
* bAsyncConnect -- Connect
* lpszBindAddress -- nullptrTcpClient/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() = default;
};
/************************************************************************
TCP
TCP 访
************************************************************************/
class ITcpClient : public IClient
{
public:
/***********************************************************************/
/***************************** 组件操作方法 *****************************/
/*
*
* 4096 KB
*
* lpszFileName --
* pHead --
* pTail --
* TRUE --
* FALSE -- SYS_GetLastError()
*/
virtual BOOL SendSmallFile(LPCTSTR lpszFileName, const LPWSABUF pHead = nullptr, const LPWSABUF pTail = nullptr) = 0;
#ifdef _SSL_SUPPORT
/*
* 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;
#endif
public:
/***********************************************************************/
/***************************** 属性访问方法 *****************************/
/* 设置同步连接超时时间(毫秒) */
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;
#ifdef _SSL_SUPPORT
/* 设置通信组件握手方式默认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;
#endif
};
#ifdef _UDP_SUPPORT
/************************************************************************
UDP
UDP 访
************************************************************************/
class IUdpClient : public IClient
{
public:
/***********************************************************************/
/***************************** 组件操作方法 *****************************/
public:
/***********************************************************************/
/***************************** 属性访问方法 *****************************/
/* 设置数据报文最大长度(建议在局域网环境下不超过 1432 字节,在广域网环境下不超过 548 字节) */
virtual void SetMaxDatagramSize (DWORD dwMaxDatagramSize) = 0;
/* 获取数据报文最大长度 */
virtual DWORD GetMaxDatagramSize() = 0;
/* 设置监测包尝试次数0 则不发送监测跳包,如果超过最大尝试次数则认为已断线) */
virtual void SetDetectAttempts (DWORD dwDetectAttempts) = 0;
/* 设置监测包发送间隔毫秒0 不发送监测包) */
virtual void SetDetectInterval (DWORD dwDetectInterval) = 0;
/* 获取心跳检查次数 */
virtual DWORD GetDetectAttempts () = 0;
/* 获取心跳检查间隔 */
virtual DWORD GetDetectInterval () = 0;
};
/************************************************************************
UDP
UDP 广访
************************************************************************/
class IUdpCast : public IClient
{
public:
/***********************************************************************/
/***************************** 组件操作方法 *****************************/
public:
/***********************************************************************/
/***************************** 属性访问方法 *****************************/
/* 设置数据报文最大长度(建议在局域网环境下不超过 1432 字节,在广域网环境下不超过 548 字节) */
virtual void SetMaxDatagramSize (DWORD dwMaxDatagramSize) = 0;
/* 获取数据报文最大长度 */
virtual DWORD GetMaxDatagramSize() = 0;
/* 设置传播模式(组播或广播) */
virtual void SetCastMode (EnCastMode enCastMode) = 0;
/* 获取传播模式 */
virtual EnCastMode GetCastMode () = 0;
/* 设置组播报文的 TTL0 - 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;
/* 获取当前数据报的远程地址信息(通常在 OnReceive 事件中调用) */
virtual BOOL GetRemoteAddress (TCHAR lpszAddress[], int& iAddressLen, USHORT& usPort) = 0;
};
/************************************************************************
UDP
UDP 访
************************************************************************/
class IUdpNode
{
public:
/***********************************************************************/
/***************************** 组件操作方法 *****************************/
/*
*
* 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;
/* 设置组播报文的 TTL0 - 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;
/* 设置是否开启 IPv4/IPv6 双栈默认TRUE */
virtual void SetDualStack(BOOL bDualStack) = 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;
/* 检测是否开启 IPv4/IPv6 双栈 */
virtual BOOL IsDualStack() = 0;
/* 获取工作线程数量 */
virtual DWORD GetWorkerThreadCount () = 0;
/* 获取 Receive 预投递数量 */
virtual DWORD GetPostReceiveCount () = 0;
/* 获取内存块缓存池大小 */
virtual DWORD GetFreeBufferPoolSize () = 0;
/* 获取内存块缓存池回收阀值 */
virtual DWORD GetFreeBufferPoolHold () = 0;
public:
virtual ~IUdpNode() = default;
};
/************************************************************************
Client ARQ
Client ARQ
************************************************************************/
class IArqClient
{
public:
/***********************************************************************/
/***************************** 组件操作方法 *****************************/
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() = default;
};
/************************************************************************
UDP ARQ
ARQ Client
************************************************************************/
typedef DualInterface<IArqClient, IUdpClient> IUdpArqClient;
#endif
/************************************************************************
Server/Agent PULL
Server/Agent PULL
************************************************************************/
class IPullSocket
{
public:
/*
*
* 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() = default;
};
/************************************************************************
Client PULL
Client PULL
************************************************************************/
class IPullClient
{
public:
/*
*
* 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() = default;
};
/************************************************************************
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:
/***********************************************************************/
/***************************** 属性访问方法 *****************************/
/* 设置数据包最大长度(有效数据包最大长度不能超过 4194303/0x3FFFFF 字节默认262144/0x40000 */
virtual void SetMaxPackSize (DWORD dwMaxPackSize) = 0;
/* 设置包头标识(有效包头标识取值范围 0 ~ 1023/0x3FF当包头标识为 0 时不校验包头默认0 */
virtual void SetPackHeaderFlag (USHORT usPackHeaderFlag) = 0;
/* 获取数据包最大长度 */
virtual DWORD GetMaxPackSize () = 0;
/* 获取包头标识 */
virtual USHORT GetPackHeaderFlag() = 0;
public:
virtual ~IPackSocket() = default;
};
/************************************************************************
Client PACK
Client PACK
************************************************************************/
class IPackClient
{
public:
/***********************************************************************/
/***************************** 属性访问方法 *****************************/
/* 设置数据包最大长度(有效数据包最大长度不能超过 4194303/0x3FFFFF 字节默认262144/0x40000 */
virtual void SetMaxPackSize (DWORD dwMaxPackSize) = 0;
/* 设置包头标识(有效包头标识取值范围 0 ~ 1023/0x3FF当包头标识为 0 时不校验包头默认0 */
virtual void SetPackHeaderFlag (USHORT usPackHeaderFlag) = 0;
/* 获取数据包最大长度 */
virtual DWORD GetMaxPackSize () = 0;
/* 获取包头标识 */
virtual USHORT GetPackHeaderFlag() = 0;
public:
virtual ~IPackClient() = default;
};
/************************************************************************
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:
/*
*
* 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() = default;
};
template<class T> class IComplexSocketListenerT : public ISocketListenerT<T>
{
public:
/*
*
* Socket
*
* pSender --
*
*/
virtual EnHandleResult OnShutdown(T* pSender) = 0;
};
/************************************************************************
Socket
Socket
************************************************************************/
template<class T> class IServerListenerT : public IComplexSocketListenerT<T>
{
public:
/*
*
* 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;
};
/************************************************************************
TCP Socket
TCP Socket
************************************************************************/
class ITcpServerListener : public IServerListenerT<ITcpServer>
{
public:
};
/************************************************************************
PUSH Socket
************************************************************************/
class CTcpServerListener : public ITcpServerListener
{
public:
virtual EnHandleResult OnPrepareListen(ITcpServer* pSender, SOCKET soListen) override {return HR_IGNORE;}
virtual EnHandleResult OnAccept(ITcpServer* pSender, CONNID dwConnID, UINT_PTR soClient) override {return HR_IGNORE;}
virtual EnHandleResult OnHandShake(ITcpServer* pSender, CONNID dwConnID) override {return HR_IGNORE;}
virtual EnHandleResult OnReceive(ITcpServer* pSender, CONNID dwConnID, int iLength) override {return HR_IGNORE;}
virtual EnHandleResult OnSend(ITcpServer* pSender, CONNID dwConnID, const BYTE* pData, int iLength) override {return HR_IGNORE;}
virtual EnHandleResult OnShutdown(ITcpServer* pSender) override {return HR_IGNORE;}
};
/************************************************************************
PULL Socket
************************************************************************/
class CTcpPullServerListener : public CTcpServerListener
{
public:
virtual EnHandleResult OnReceive(ITcpServer* pSender, CONNID dwConnID, int iLength) override = 0;
virtual EnHandleResult OnReceive(ITcpServer* pSender, CONNID dwConnID, const BYTE* pData, int iLength) override {return HR_IGNORE;}
};
#ifdef _UDP_SUPPORT
/************************************************************************
UDP Socket
UDP Socket
************************************************************************/
class IUdpServerListener : public IServerListenerT<IUdpServer>
{
public:
};
/************************************************************************
UDP Socket
************************************************************************/
class CUdpServerListener : public IUdpServerListener
{
public:
virtual EnHandleResult OnPrepareListen(IUdpServer* pSender, SOCKET soListen) override {return HR_IGNORE;}
virtual EnHandleResult OnAccept(IUdpServer* pSender, CONNID dwConnID, UINT_PTR pSockAddr) override {return HR_IGNORE;}
virtual EnHandleResult OnHandShake(IUdpServer* pSender, CONNID dwConnID) override {return HR_IGNORE;}
virtual EnHandleResult OnReceive(IUdpServer* pSender, CONNID dwConnID, int iLength) override {return HR_IGNORE;}
virtual EnHandleResult OnSend(IUdpServer* pSender, CONNID dwConnID, const BYTE* pData, int iLength) override {return HR_IGNORE;}
virtual EnHandleResult OnShutdown(IUdpServer* pSender) override {return HR_IGNORE;}
};
#endif
/************************************************************************
Socket
Socket
************************************************************************/
template<class T> class IAgentListenerT : public IComplexSocketListenerT<T>
{
public:
/*
*
* 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;
};
/************************************************************************
TCP Socket
TCP Socket
************************************************************************/
class ITcpAgentListener : public IAgentListenerT<ITcpAgent>
{
public:
};
/************************************************************************
PUSH Socket
************************************************************************/
class CTcpAgentListener : public ITcpAgentListener
{
public:
virtual EnHandleResult OnPrepareConnect(ITcpAgent* pSender, CONNID dwConnID, SOCKET socket) override {return HR_IGNORE;}
virtual EnHandleResult OnConnect(ITcpAgent* pSender, CONNID dwConnID) override {return HR_IGNORE;}
virtual EnHandleResult OnHandShake(ITcpAgent* pSender, CONNID dwConnID) override {return HR_IGNORE;}
virtual EnHandleResult OnReceive(ITcpAgent* pSender, CONNID dwConnID, int iLength) override {return HR_IGNORE;}
virtual EnHandleResult OnSend(ITcpAgent* pSender, CONNID dwConnID, const BYTE* pData, int iLength) override {return HR_IGNORE;}
virtual EnHandleResult OnShutdown(ITcpAgent* pSender) override {return HR_IGNORE;}
};
/************************************************************************
PULL Socket
************************************************************************/
class CTcpPullAgentListener : public CTcpAgentListener
{
public:
virtual EnHandleResult OnReceive(ITcpAgent* pSender, CONNID dwConnID, int iLength) override = 0;
virtual EnHandleResult OnReceive(ITcpAgent* pSender, CONNID dwConnID, const BYTE* pData, int iLength) override {return HR_IGNORE;}
};
/************************************************************************
Socket
Socket
************************************************************************/
template<class T> class IClientListenerT : public ISocketListenerT<T>
{
public:
/*
*
* 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;
};
/************************************************************************
TCP Socket
TCP Socket
************************************************************************/
class ITcpClientListener : public IClientListenerT<ITcpClient>
{
public:
};
/************************************************************************
PUSH Socket
************************************************************************/
class CTcpClientListener : public ITcpClientListener
{
public:
virtual EnHandleResult OnPrepareConnect(ITcpClient* pSender, CONNID dwConnID, SOCKET socket) override {return HR_IGNORE;}
virtual EnHandleResult OnConnect(ITcpClient* pSender, CONNID dwConnID) override {return HR_IGNORE;}
virtual EnHandleResult OnHandShake(ITcpClient* pSender, CONNID dwConnID) override {return HR_IGNORE;}
virtual EnHandleResult OnReceive(ITcpClient* pSender, CONNID dwConnID, int iLength) override {return HR_IGNORE;}
virtual EnHandleResult OnSend(ITcpClient* pSender, CONNID dwConnID, const BYTE* pData, int iLength) override {return HR_IGNORE;}
};
/************************************************************************
PULL Socket
************************************************************************/
class CTcpPullClientListener : public CTcpClientListener
{
public:
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;}
};
#ifdef _UDP_SUPPORT
/************************************************************************
UDP Socket
UDP Socket
************************************************************************/
class IUdpClientListener : public IClientListenerT<IUdpClient>
{
public:
};
/************************************************************************
UDP Socket
************************************************************************/
class CUdpClientListener : public IUdpClientListener
{
public:
virtual EnHandleResult OnPrepareConnect(IUdpClient* pSender, CONNID dwConnID, SOCKET socket) override {return HR_IGNORE;}
virtual EnHandleResult OnConnect(IUdpClient* pSender, CONNID dwConnID) override {return HR_IGNORE;}
virtual EnHandleResult OnHandShake(IUdpClient* pSender, CONNID dwConnID) override {return HR_IGNORE;}
virtual EnHandleResult OnReceive(IUdpClient* pSender, CONNID dwConnID, int iLength) override {return HR_IGNORE;}
virtual EnHandleResult OnSend(IUdpClient* pSender, CONNID dwConnID, const BYTE* pData, int iLength) override {return HR_IGNORE;}
};
/************************************************************************
UDP Socket
UDP Socket
************************************************************************/
class IUdpCastListener : public IClientListenerT<IUdpCast>
{
public:
};
/************************************************************************
UDP Socket
************************************************************************/
class CUdpCastListener : public IUdpCastListener
{
public:
virtual EnHandleResult OnPrepareConnect(IUdpCast* pSender, CONNID dwConnID, SOCKET socket) override {return HR_IGNORE;}
virtual EnHandleResult OnConnect(IUdpCast* pSender, CONNID dwConnID) override {return HR_IGNORE;}
virtual EnHandleResult OnHandShake(IUdpCast* pSender, CONNID dwConnID) override {return HR_IGNORE;}
virtual EnHandleResult OnReceive(IUdpCast* pSender, CONNID dwConnID, int iLength) override {return HR_IGNORE;}
virtual EnHandleResult OnSend(IUdpCast* pSender, CONNID dwConnID, const BYTE* pData, int iLength) override {return HR_IGNORE;}
};
/************************************************************************
UDP Socket
UDP Socket
************************************************************************/
class IUdpNodeListener
{
public:
/*
*
* 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() = default;
};
/************************************************************************
UDP Socket
************************************************************************/
class CUdpNodeListener : public IUdpNodeListener
{
public:
virtual EnHandleResult OnPrepareListen(IUdpNode* pSender, SOCKET soListen) override {return HR_IGNORE;}
virtual EnHandleResult OnSend(IUdpNode* pSender, LPCTSTR lpszRemoteAddress, USHORT usRemotePort, const BYTE* pData, int iLength) override {return HR_IGNORE;}
virtual EnHandleResult OnShutdown(IUdpNode* pSender) override {return HR_IGNORE;}
};
#endif
/*****************************************************************************************************************************************************/
/****************************************************************** HTTP Interfaces ******************************************************************/
/*****************************************************************************************************************************************************/
#ifdef _HTTP_SUPPORT
/************************************************************************
Http
Http 访 Http Http
************************************************************************/
class IComplexHttp
{
public:
/***********************************************************************/
/***************************** 组件操作方法 *****************************/
/*
* 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() = default;
};
/************************************************************************
Http
Http 访
************************************************************************/
class IComplexHttpRequester : public IComplexHttp
{
public:
/***********************************************************************/
/***************************** 组件操作方法 *****************************/
/*
* 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;
};
/************************************************************************
Http
Http 访
************************************************************************/
class IComplexHttpResponder : public IComplexHttp
{
public:
/***********************************************************************/
/***************************** 组件操作方法 *****************************/
/*
* 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;
};
/************************************************************************
HTTP
HTTP 访
************************************************************************/
class IHttp
{
public:
/***********************************************************************/
/***************************** 组件操作方法 *****************************/
/*
* 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() = default;
};
/************************************************************************
Http
Http 访
************************************************************************/
class IHttpRequester : public IHttp
{
public:
/***********************************************************************/
/***************************** 组件操作方法 *****************************/
/*
*
* 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;
};
/************************************************************************
Http
Http 访
************************************************************************/
class IHttpSyncRequester : public IHttpRequester
{
public:
/*
* 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;
};
/************************************************************************
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:
/*
*
* 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() = default;
};
/************************************************************************
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:
virtual EnHandleResult OnPrepareListen(ITcpServer* pSender, SOCKET soListen) override {return HR_IGNORE;}
virtual EnHandleResult OnAccept(ITcpServer* pSender, CONNID dwConnID, UINT_PTR soClient) override {return HR_IGNORE;}
virtual EnHandleResult OnHandShake(ITcpServer* pSender, CONNID dwConnID) override {return HR_IGNORE;}
virtual EnHandleResult OnReceive(ITcpServer* pSender, CONNID dwConnID, int iLength) override {return HR_IGNORE;}
virtual EnHandleResult OnReceive(ITcpServer* pSender, CONNID dwConnID, const BYTE* pData, int iLength) override {return HR_IGNORE;}
virtual EnHandleResult OnSend(ITcpServer* pSender, CONNID dwConnID, const BYTE* pData, int iLength) override {return HR_IGNORE;}
virtual EnHandleResult OnShutdown(ITcpServer* pSender) override {return HR_IGNORE;}
virtual EnHttpParseResult OnMessageBegin(IHttpServer* pSender, CONNID dwConnID) override {return HPR_OK;}
virtual EnHttpParseResult OnRequestLine(IHttpServer* pSender, CONNID dwConnID, LPCSTR lpszMethod, LPCSTR lpszUrl) override {return HPR_OK;}
virtual EnHttpParseResult OnStatusLine(IHttpServer* pSender, CONNID dwConnID, USHORT usStatusCode, LPCSTR lpszDesc) override {return HPR_OK;}
virtual EnHttpParseResult OnHeader(IHttpServer* pSender, CONNID dwConnID, LPCSTR lpszName, LPCSTR lpszValue) override {return HPR_OK;}
virtual EnHttpParseResult OnChunkHeader(IHttpServer* pSender, CONNID dwConnID, int iLength) override {return HPR_OK;}
virtual EnHttpParseResult OnChunkComplete(IHttpServer* pSender, CONNID dwConnID) override {return HPR_OK;}
virtual EnHttpParseResult OnUpgrade(IHttpServer* pSender, CONNID dwConnID, EnHttpUpgradeType enUpgradeType) override {return HPR_OK;}
virtual EnHandleResult OnWSMessageHeader(IHttpServer* pSender, CONNID dwConnID, BOOL bFinal, BYTE iReserved, BYTE iOperationCode, const BYTE lpszMask[4], ULONGLONG ullBodyLen) override {return HR_IGNORE;}
virtual EnHandleResult OnWSMessageBody(IHttpServer* pSender, CONNID dwConnID, const BYTE* pData, int iLength) override {return HR_IGNORE;}
virtual EnHandleResult OnWSMessageComplete(IHttpServer* pSender, CONNID dwConnID) override {return HR_IGNORE;}
};
/************************************************************************
IHttpAgentListener
************************************************************************/
class CHttpAgentListener : public IHttpAgentListener
{
public:
virtual EnHandleResult OnPrepareConnect(ITcpAgent* pSender, CONNID dwConnID, SOCKET socket) override {return HR_IGNORE;}
virtual EnHandleResult OnConnect(ITcpAgent* pSender, CONNID dwConnID) override {return HR_IGNORE;}
virtual EnHandleResult OnHandShake(ITcpAgent* pSender, CONNID dwConnID) override {return HR_IGNORE;}
virtual EnHandleResult OnReceive(ITcpAgent* pSender, CONNID dwConnID, int iLength) override {return HR_IGNORE;}
virtual EnHandleResult OnReceive(ITcpAgent* pSender, CONNID dwConnID, const BYTE* pData, int iLength) override {return HR_IGNORE;}
virtual EnHandleResult OnSend(ITcpAgent* pSender, CONNID dwConnID, const BYTE* pData, int iLength) override {return HR_IGNORE;}
virtual EnHandleResult OnShutdown(ITcpAgent* pSender) override {return HR_IGNORE;}
virtual EnHttpParseResult OnMessageBegin(IHttpAgent* pSender, CONNID dwConnID) override {return HPR_OK;}
virtual EnHttpParseResult OnRequestLine(IHttpAgent* pSender, CONNID dwConnID, LPCSTR lpszMethod, LPCSTR lpszUrl) override {return HPR_OK;}
virtual EnHttpParseResult OnStatusLine(IHttpAgent* pSender, CONNID dwConnID, USHORT usStatusCode, LPCSTR lpszDesc) override {return HPR_OK;}
virtual EnHttpParseResult OnHeader(IHttpAgent* pSender, CONNID dwConnID, LPCSTR lpszName, LPCSTR lpszValue) override {return HPR_OK;}
virtual EnHttpParseResult OnChunkHeader(IHttpAgent* pSender, CONNID dwConnID, int iLength) override {return HPR_OK;}
virtual EnHttpParseResult OnChunkComplete(IHttpAgent* pSender, CONNID dwConnID) override {return HPR_OK;}
virtual EnHttpParseResult OnUpgrade(IHttpAgent* pSender, CONNID dwConnID, EnHttpUpgradeType enUpgradeType) override {return HPR_OK;}
virtual EnHandleResult OnWSMessageHeader(IHttpAgent* pSender, CONNID dwConnID, BOOL bFinal, BYTE iReserved, BYTE iOperationCode, const BYTE lpszMask[4], ULONGLONG ullBodyLen) override {return HR_IGNORE;}
virtual EnHandleResult OnWSMessageBody(IHttpAgent* pSender, CONNID dwConnID, const BYTE* pData, int iLength) override {return HR_IGNORE;}
virtual EnHandleResult OnWSMessageComplete(IHttpAgent* pSender, CONNID dwConnID) override {return HR_IGNORE;}
};
/************************************************************************
IHttpClientListener
************************************************************************/
class CHttpClientListener : public IHttpClientListener
{
public:
virtual EnHandleResult OnPrepareConnect(ITcpClient* pSender, CONNID dwConnID, SOCKET socket) override {return HR_IGNORE;}
virtual EnHandleResult OnConnect(ITcpClient* pSender, CONNID dwConnID) override {return HR_IGNORE;}
virtual EnHandleResult OnHandShake(ITcpClient* pSender, CONNID dwConnID) override {return HR_IGNORE;}
virtual EnHandleResult OnReceive(ITcpClient* pSender, CONNID dwConnID, int iLength) override {return HR_IGNORE;}
virtual EnHandleResult OnReceive(ITcpClient* pSender, CONNID dwConnID, const BYTE* pData, int iLength) override {return HR_IGNORE;}
virtual EnHandleResult OnSend(ITcpClient* pSender, CONNID dwConnID, const BYTE* pData, int iLength) override {return HR_IGNORE;}
virtual EnHttpParseResult OnMessageBegin(IHttpClient* pSender, CONNID dwConnID) override {return HPR_OK;}
virtual EnHttpParseResult OnRequestLine(IHttpClient* pSender, CONNID dwConnID, LPCSTR lpszMethod, LPCSTR lpszUrl) override {return HPR_OK;}
virtual EnHttpParseResult OnStatusLine(IHttpClient* pSender, CONNID dwConnID, USHORT usStatusCode, LPCSTR lpszDesc) override {return HPR_OK;}
virtual EnHttpParseResult OnHeader(IHttpClient* pSender, CONNID dwConnID, LPCSTR lpszName, LPCSTR lpszValue) override {return HPR_OK;}
virtual EnHttpParseResult OnChunkHeader(IHttpClient* pSender, CONNID dwConnID, int iLength) override {return HPR_OK;}
virtual EnHttpParseResult OnChunkComplete(IHttpClient* pSender, CONNID dwConnID) override {return HPR_OK;}
virtual EnHttpParseResult OnUpgrade(IHttpClient* pSender, CONNID dwConnID, EnHttpUpgradeType enUpgradeType) override {return HPR_OK;}
virtual EnHandleResult OnWSMessageHeader(IHttpClient* pSender, CONNID dwConnID, BOOL bFinal, BYTE iReserved, BYTE iOperationCode, const BYTE lpszMask[4], ULONGLONG ullBodyLen) override {return HR_IGNORE;}
virtual EnHandleResult OnWSMessageBody(IHttpClient* pSender, CONNID dwConnID, const BYTE* pData, int iLength) override {return HR_IGNORE;}
virtual EnHandleResult OnWSMessageComplete(IHttpClient* pSender, CONNID dwConnID) override {return HR_IGNORE;}
};
/************************************************************************
IHttpClientListener
************************************************************************/
class CHttpSyncClientListener : public CHttpClientListener
{
public:
virtual EnHandleResult OnClose(ITcpClient* pSender, CONNID dwConnID, EnSocketOperation enOperation, int iErrorCode) override {return HR_IGNORE;}
virtual EnHttpParseResult OnHeadersComplete(IHttpClient* pSender, CONNID dwConnID) override {return HPR_OK;}
virtual EnHttpParseResult OnBody(IHttpClient* pSender, CONNID dwConnID, const BYTE* pData, int iLength) override {return HPR_OK;}
virtual EnHttpParseResult OnMessageComplete(IHttpClient* pSender, CONNID dwConnID) override {return HPR_OK;}
virtual EnHttpParseResult OnParseError(IHttpClient* pSender, CONNID dwConnID, int iErrorCode, LPCSTR lpszErrorDesc) override {return HPR_OK;}
};
#endif
/*****************************************************************************************************************************************************/
/************************************************************** Thread Pool Interfaces ***************************************************************/
/*****************************************************************************************************************************************************/
/************************************************************************
线
线访
************************************************************************/
class IHPThreadPool
{
public:
/***********************************************************************/
/***************************** 组件操作方法 *****************************/
/*
* 线
*
*
* 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() = default;
};
/************************************************************************
线
线
************************************************************************/
class IHPThreadPoolListener
{
public:
/*
* 线
* 线
*
* 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() {};
};
/************************************************************************
线
************************************************************************/
class CHPThreadPoolListener : public IHPThreadPoolListener
{
public:
virtual void OnStartup(IHPThreadPool* pThreadPool) override {}
virtual void OnShutdown(IHPThreadPool* pThreadPool) override {}
virtual void OnWorkerThreadStart(IHPThreadPool* pThreadPool, THR_ID dwThreadID) override {}
virtual void OnWorkerThreadEnd(IHPThreadPool* pThreadPool, THR_ID dwThreadID) override {}
};
/************************************************************************
访
************************************************************************/
class IHPCompressor
{
public:
/***********************************************************************/
/***************************** 组件操作方法 *****************************/
/*
*
*
*
* 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() = default;
};
/************************************************************************
访
************************************************************************/
class IHPDecompressor
{
public:
/***********************************************************************/
/***************************** 组件操作方法 *****************************/
/*
*
*
*
* pData --
* iLength --
* pContext -- Fn_DecompressDataCallback
*
* TRUE --
* FALSE -- SYS_GetLastError()
*/
virtual BOOL Process(const BYTE* pData, int iLength, PVOID pContext = nullptr) = 0;
/* 重置解压器 */
virtual BOOL Reset() = 0;
public:
/***********************************************************************/
/***************************** 属性访问方法 *****************************/
/* 检测解压器是否可用 */
virtual BOOL IsValid() = 0;
public:
virtual ~IHPDecompressor() = default;
};