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 .
*/
/******************************************************************************
Module : HPSocket
Usage :
方 法 一 :
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
0. 应 用 程 序 包 含 HPTypeDef . h / SocketInterface . h / HPSocket . h 头 文 件
1. 调 用 HP_Create_Xxx ( ) 函 数 创 建 HPSocket 对 象
2. 使 用 完 毕 后 调 用 HP_Destroy_Xxx ( ) 函 数 销 毁 HPSocket 对 象
方 法 二 :
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
0. 应 用 程 序 包 含 SocketInterface . h 和 HPSocket . h 头 文 件
1. 创 建 CXxxPtr 智 能 指 针 , 通 过 智 能 指 针 使 用 HPSocket 对 象
Release :
< - - 动 态 链 接 库 - - >
1. x86 / HPSocket . dll - ( 32 位 / MBCS / Release )
2. x86 / HPSocket_D . dll - ( 32 位 / MBCS / DeBug )
3. x86 / HPSocket_U . dll - ( 32 位 / UNICODE / Release )
4. x86 / HPSocket_UD . dll - ( 32 位 / UNICODE / DeBug )
5. x64 / HPSocket . dll - ( 64 位 / MBCS / Release )
6. x64 / HPSocket_D . dll - ( 64 位 / MBCS / DeBug )
7. x64 / HPSocket_U . dll - ( 64 位 / UNICODE / Release )
8. x64 / HPSocket_UD . dll - ( 64 位 / UNICODE / DeBug )
< - - 静 态 链 接 库 - - >
! ! 注 意 ! ! : 使 用 HPSocket 静 态 库 时 , 需 要 在 工 程 属 性 中 定 义 预 处 理 宏 - > HPSOCKET_STATIC_LIB
1. x86 / static / HPSocket . lib - ( 32 位 / MBCS / Release )
2. x86 / static / HPSocket_D . lib - ( 32 位 / MBCS / DeBug )
3. x86 / static / HPSocket_U . lib - ( 32 位 / UNICODE / Release )
4. x86 / static / HPSocket_UD . lib - ( 32 位 / UNICODE / DeBug )
5. x64 / static / HPSocket . lib - ( 64 位 / MBCS / Release )
6. x64 / static / HPSocket_D . lib - ( 64 位 / MBCS / DeBug )
7. x64 / static / HPSocket_U . lib - ( 64 位 / UNICODE / Release )
8. x64 / static / HPSocket_UD . lib - ( 64 位 / UNICODE / DeBug )
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
# pragma once
# include "SocketInterface.h"
/*****************************************************************************************************************************************************/
/****************************************************************** TCP/UDP Exports ******************************************************************/
/*****************************************************************************************************************************************************/
/**************************************************/
/************** HPSocket 对象智能指针 **************/
template < class T , class _Listener , class _Creator > class CHPObjectPtr
{
public :
2025-10-15 04:32:59 +08:00
CHPObjectPtr & Reset ( T * pObj = nullptr )
{
if ( pObj ! = m_pObj ) {
if ( m_pObj )
_Creator : : Destroy ( m_pObj ) ;
m_pObj = pObj ;
}
return * this ;
}
CHPObjectPtr & Attach ( T * pObj )
{
return Reset ( pObj ) ;
}
T * Detach ( )
{
T * pObj = m_pObj ;
m_pObj = nullptr ;
return pObj ;
}
BOOL IsValid ( ) const
{
return m_pObj ! = nullptr ;
}
T * Get ( ) const
{
return m_pObj ;
}
T * operator - > ( ) const
{
return m_pObj ;
}
operator T * ( ) const
{
return m_pObj ;
}
CHPObjectPtr & operator = ( T * pObj )
{
return Reset ( pObj ) ;
}
2025-05-03 20:57:22 +08:00
public :
2025-10-15 04:32:59 +08:00
CHPObjectPtr ( _Listener * pListener = nullptr )
{
m_pObj = _Creator : : Create ( pListener ) ;
}
2025-05-03 20:57:22 +08:00
2025-10-15 04:32:59 +08:00
CHPObjectPtr ( BOOL bCreate , _Listener * pListener = nullptr )
{
m_pObj = bCreate ? _Creator : : Create ( pListener ) : nullptr ;
}
2025-05-03 20:57:22 +08:00
2025-10-15 04:32:59 +08:00
virtual ~ CHPObjectPtr ( )
{
Reset ( ) ;
}
2025-05-03 20:57:22 +08:00
private :
2025-10-15 04:32:59 +08:00
CHPObjectPtr ( const CHPObjectPtr & ) ;
CHPObjectPtr & operator = ( const CHPObjectPtr & ) ;
2025-05-03 20:57:22 +08:00
protected :
2025-10-15 04:32:59 +08:00
T * m_pObj ;
2025-05-03 20:57:22 +08:00
} ;
/**************************************************/
/**************** HPSocket 导出函数 ****************/
// 创建 ITcpServer 对象
HPSOCKET_API ITcpServer * HP_Create_TcpServer ( ITcpServerListener * pListener ) ;
// 创建 ITcpAgent 对象
HPSOCKET_API ITcpAgent * HP_Create_TcpAgent ( ITcpAgentListener * pListener ) ;
// 创建 ITcpClient 对象
HPSOCKET_API ITcpClient * HP_Create_TcpClient ( ITcpClientListener * pListener ) ;
// 创建 ITcpPullServer 对象
HPSOCKET_API ITcpPullServer * HP_Create_TcpPullServer ( ITcpServerListener * pListener ) ;
// 创建 ITcpPullAgent 对象
HPSOCKET_API ITcpPullAgent * HP_Create_TcpPullAgent ( ITcpAgentListener * pListener ) ;
// 创建 ITcpPullClient 对象
HPSOCKET_API ITcpPullClient * HP_Create_TcpPullClient ( ITcpClientListener * pListener ) ;
// 创建 ITcpPackServer 对象
HPSOCKET_API ITcpPackServer * HP_Create_TcpPackServer ( ITcpServerListener * pListener ) ;
// 创建 ITcpPackAgent 对象
HPSOCKET_API ITcpPackAgent * HP_Create_TcpPackAgent ( ITcpAgentListener * pListener ) ;
// 创建 ITcpPackClient 对象
HPSOCKET_API ITcpPackClient * HP_Create_TcpPackClient ( ITcpClientListener * pListener ) ;
// 销毁 ITcpServer 对象
HPSOCKET_API void HP_Destroy_TcpServer ( ITcpServer * pServer ) ;
// 销毁 ITcpAgent 对象
HPSOCKET_API void HP_Destroy_TcpAgent ( ITcpAgent * pAgent ) ;
// 销毁 ITcpClient 对象
HPSOCKET_API void HP_Destroy_TcpClient ( ITcpClient * pClient ) ;
// 销毁 ITcpPullServer 对象
HPSOCKET_API void HP_Destroy_TcpPullServer ( ITcpPullServer * pServer ) ;
// 销毁 ITcpPullAgent 对象
HPSOCKET_API void HP_Destroy_TcpPullAgent ( ITcpPullAgent * pAgent ) ;
// 销毁 ITcpPullClient 对象
HPSOCKET_API void HP_Destroy_TcpPullClient ( ITcpPullClient * pClient ) ;
// 销毁 ITcpPackServer 对象
HPSOCKET_API void HP_Destroy_TcpPackServer ( ITcpPackServer * pServer ) ;
// 销毁 ITcpPackAgent 对象
HPSOCKET_API void HP_Destroy_TcpPackAgent ( ITcpPackAgent * pAgent ) ;
// 销毁 ITcpPackClient 对象
HPSOCKET_API void HP_Destroy_TcpPackClient ( ITcpPackClient * pClient ) ;
# ifdef _UDP_SUPPORT
// 创建 IUdpServer 对象
HPSOCKET_API IUdpServer * HP_Create_UdpServer ( IUdpServerListener * pListener ) ;
// 创建 IUdpClient 对象
HPSOCKET_API IUdpClient * HP_Create_UdpClient ( IUdpClientListener * pListener ) ;
// 创建 IUdpCast 对象
HPSOCKET_API IUdpCast * HP_Create_UdpCast ( IUdpCastListener * pListener ) ;
// 创建 IUdpNode 对象
HPSOCKET_API IUdpNode * HP_Create_UdpNode ( IUdpNodeListener * pListener ) ;
// 创建 IUdpArqServer 对象
HPSOCKET_API IUdpArqServer * HP_Create_UdpArqServer ( IUdpServerListener * pListener ) ;
// 创建 IUdpArqClient 对象
HPSOCKET_API IUdpArqClient * HP_Create_UdpArqClient ( IUdpClientListener * pListener ) ;
// 销毁 IUdpServer 对象
HPSOCKET_API void HP_Destroy_UdpServer ( IUdpServer * pServer ) ;
// 销毁 IUdpClient 对象
HPSOCKET_API void HP_Destroy_UdpClient ( IUdpClient * pClient ) ;
// 销毁 IUdpCast 对象
HPSOCKET_API void HP_Destroy_UdpCast ( IUdpCast * pCast ) ;
// 销毁 IUdpNode 对象
HPSOCKET_API void HP_Destroy_UdpNode ( IUdpNode * pNode ) ;
// 销毁 IUdpArqServer 对象
HPSOCKET_API void HP_Destroy_UdpArqServer ( IUdpArqServer * pServer ) ;
// 销毁 IUdpArqClient 对象
HPSOCKET_API void HP_Destroy_UdpArqClient ( IUdpArqClient * pClient ) ;
# endif
// ITcpServer 对象创建器
2025-10-15 04:32:59 +08:00
struct TcpServer_Creator {
static ITcpServer * Create ( ITcpServerListener * pListener )
{
return HP_Create_TcpServer ( pListener ) ;
}
static void Destroy ( ITcpServer * pServer )
{
HP_Destroy_TcpServer ( pServer ) ;
}
2025-05-03 20:57:22 +08:00
} ;
// ITcpAgent 对象创建器
2025-10-15 04:32:59 +08:00
struct TcpAgent_Creator {
static ITcpAgent * Create ( ITcpAgentListener * pListener )
{
return HP_Create_TcpAgent ( pListener ) ;
}
static void Destroy ( ITcpAgent * pAgent )
{
HP_Destroy_TcpAgent ( pAgent ) ;
}
2025-05-03 20:57:22 +08:00
} ;
// ITcpClient 对象创建器
2025-10-15 04:32:59 +08:00
struct TcpClient_Creator {
static ITcpClient * Create ( ITcpClientListener * pListener )
{
return HP_Create_TcpClient ( pListener ) ;
}
static void Destroy ( ITcpClient * pClient )
{
HP_Destroy_TcpClient ( pClient ) ;
}
2025-05-03 20:57:22 +08:00
} ;
// ITcpPullServer 对象创建器
2025-10-15 04:32:59 +08:00
struct TcpPullServer_Creator {
static ITcpPullServer * Create ( ITcpServerListener * pListener )
{
return HP_Create_TcpPullServer ( pListener ) ;
}
static void Destroy ( ITcpPullServer * pServer )
{
HP_Destroy_TcpPullServer ( pServer ) ;
}
2025-05-03 20:57:22 +08:00
} ;
// ITcpPullAgent 对象创建器
2025-10-15 04:32:59 +08:00
struct TcpPullAgent_Creator {
static ITcpPullAgent * Create ( ITcpAgentListener * pListener )
{
return HP_Create_TcpPullAgent ( pListener ) ;
}
static void Destroy ( ITcpPullAgent * pAgent )
{
HP_Destroy_TcpPullAgent ( pAgent ) ;
}
2025-05-03 20:57:22 +08:00
} ;
// ITcpPullClient 对象创建器
2025-10-15 04:32:59 +08:00
struct TcpPullClient_Creator {
static ITcpPullClient * Create ( ITcpClientListener * pListener )
{
return HP_Create_TcpPullClient ( pListener ) ;
}
static void Destroy ( ITcpPullClient * pClient )
{
HP_Destroy_TcpPullClient ( pClient ) ;
}
2025-05-03 20:57:22 +08:00
} ;
// ITcpPackServer 对象创建器
2025-10-15 04:32:59 +08:00
struct TcpPackServer_Creator {
static ITcpPackServer * Create ( ITcpServerListener * pListener )
{
return HP_Create_TcpPackServer ( pListener ) ;
}
static void Destroy ( ITcpPackServer * pServer )
{
HP_Destroy_TcpPackServer ( pServer ) ;
}
2025-05-03 20:57:22 +08:00
} ;
// ITcpPackAgent 对象创建器
2025-10-15 04:32:59 +08:00
struct TcpPackAgent_Creator {
static ITcpPackAgent * Create ( ITcpAgentListener * pListener )
{
return HP_Create_TcpPackAgent ( pListener ) ;
}
static void Destroy ( ITcpPackAgent * pAgent )
{
HP_Destroy_TcpPackAgent ( pAgent ) ;
}
2025-05-03 20:57:22 +08:00
} ;
// ITcpPackClient 对象创建器
2025-10-15 04:32:59 +08:00
struct TcpPackClient_Creator {
static ITcpPackClient * Create ( ITcpClientListener * pListener )
{
return HP_Create_TcpPackClient ( pListener ) ;
}
static void Destroy ( ITcpPackClient * pClient )
{
HP_Destroy_TcpPackClient ( pClient ) ;
}
2025-05-03 20:57:22 +08:00
} ;
// ITcpServer 对象智能指针
typedef CHPObjectPtr < ITcpServer , ITcpServerListener , TcpServer_Creator > CTcpServerPtr ;
// ITcpAgent 对象智能指针
typedef CHPObjectPtr < ITcpAgent , ITcpAgentListener , TcpAgent_Creator > CTcpAgentPtr ;
// ITcpClient 对象智能指针
typedef CHPObjectPtr < ITcpClient , ITcpClientListener , TcpClient_Creator > CTcpClientPtr ;
// ITcpPullServer 对象智能指针
typedef CHPObjectPtr < ITcpPullServer , ITcpServerListener , TcpPullServer_Creator > CTcpPullServerPtr ;
// ITcpPullAgent 对象智能指针
typedef CHPObjectPtr < ITcpPullAgent , ITcpAgentListener , TcpPullAgent_Creator > CTcpPullAgentPtr ;
// ITcpPullClient 对象智能指针
typedef CHPObjectPtr < ITcpPullClient , ITcpClientListener , TcpPullClient_Creator > CTcpPullClientPtr ;
// ITcpPackServer 对象智能指针
typedef CHPObjectPtr < ITcpPackServer , ITcpServerListener , TcpPackServer_Creator > CTcpPackServerPtr ;
// ITcpPackAgent 对象智能指针
typedef CHPObjectPtr < ITcpPackAgent , ITcpAgentListener , TcpPackAgent_Creator > CTcpPackAgentPtr ;
// ITcpPackClient 对象智能指针
typedef CHPObjectPtr < ITcpPackClient , ITcpClientListener , TcpPackClient_Creator > CTcpPackClientPtr ;
# ifdef _UDP_SUPPORT
// IUdpServer 对象创建器
2025-10-15 04:32:59 +08:00
struct UdpServer_Creator {
static IUdpServer * Create ( IUdpServerListener * pListener )
{
return HP_Create_UdpServer ( pListener ) ;
}
static void Destroy ( IUdpServer * pServer )
{
HP_Destroy_UdpServer ( pServer ) ;
}
2025-05-03 20:57:22 +08:00
} ;
// IUdpClient 对象创建器
2025-10-15 04:32:59 +08:00
struct UdpClient_Creator {
static IUdpClient * Create ( IUdpClientListener * pListener )
{
return HP_Create_UdpClient ( pListener ) ;
}
static void Destroy ( IUdpClient * pClient )
{
HP_Destroy_UdpClient ( pClient ) ;
}
2025-05-03 20:57:22 +08:00
} ;
// IUdpCast 对象创建器
2025-10-15 04:32:59 +08:00
struct UdpCast_Creator {
static IUdpCast * Create ( IUdpCastListener * pListener )
{
return HP_Create_UdpCast ( pListener ) ;
}
static void Destroy ( IUdpCast * pCast )
{
HP_Destroy_UdpCast ( pCast ) ;
}
2025-05-03 20:57:22 +08:00
} ;
// IUdpNode 对象创建器
2025-10-15 04:32:59 +08:00
struct UdpNode_Creator {
static IUdpNode * Create ( IUdpNodeListener * pListener )
{
return HP_Create_UdpNode ( pListener ) ;
}
static void Destroy ( IUdpNode * pNode )
{
HP_Destroy_UdpNode ( pNode ) ;
}
2025-05-03 20:57:22 +08:00
} ;
// IUdpArqServer 对象创建器
2025-10-15 04:32:59 +08:00
struct UdpArqServer_Creator {
static IUdpArqServer * Create ( IUdpServerListener * pListener )
{
return HP_Create_UdpArqServer ( pListener ) ;
}
static void Destroy ( IUdpArqServer * pServer )
{
HP_Destroy_UdpArqServer ( pServer ) ;
}
2025-05-03 20:57:22 +08:00
} ;
// IUdpArqClient 对象创建器
2025-10-15 04:32:59 +08:00
struct UdpArqClient_Creator {
static IUdpArqClient * Create ( IUdpClientListener * pListener )
{
return HP_Create_UdpArqClient ( pListener ) ;
}
static void Destroy ( IUdpArqClient * pClient )
{
HP_Destroy_UdpArqClient ( pClient ) ;
}
2025-05-03 20:57:22 +08:00
} ;
// IUdpServer 对象智能指针
typedef CHPObjectPtr < IUdpServer , IUdpServerListener , UdpServer_Creator > CUdpServerPtr ;
// IUdpClient 对象智能指针
typedef CHPObjectPtr < IUdpClient , IUdpClientListener , UdpClient_Creator > CUdpClientPtr ;
// IUdpCast 对象智能指针
typedef CHPObjectPtr < IUdpCast , IUdpCastListener , UdpCast_Creator > CUdpCastPtr ;
// IUdpNode 对象智能指针
typedef CHPObjectPtr < IUdpNode , IUdpNodeListener , UdpNode_Creator > CUdpNodePtr ;
// IUdpArqServer 对象智能指针
typedef CHPObjectPtr < IUdpArqServer , IUdpServerListener , UdpArqServer_Creator > CUdpArqServerPtr ;
// IUdpArqClient 对象智能指针
typedef CHPObjectPtr < IUdpArqClient , IUdpClientListener , UdpArqClient_Creator > CUdpArqClientPtr ;
# endif
/*****************************************************************************************************************************************************/
/*************************************************************** Global Function Exports *************************************************************/
/*****************************************************************************************************************************************************/
// 获取 HPSocket 版本号( 4 个字节分别为:主版本号,子版本号,修正版本号,构建编号)
HPSOCKET_API DWORD HP_GetHPSocketVersion ( ) ;
// 获取错误描述文本
HPSOCKET_API LPCTSTR HP_GetSocketErrorDesc ( EnSocketError enCode ) ;
// 调用系统的 GetLastError() 方法获取系统错误代码
HPSOCKET_API DWORD SYS_GetLastError ( ) ;
// 调用系统的 WSAGetLastError() 方法获取系统错误代码
HPSOCKET_API int SYS_WSAGetLastError ( ) ;
// 调用系统的 setsockopt()
HPSOCKET_API int SYS_SetSocketOption ( SOCKET sock , int level , int name , LPVOID val , int len ) ;
// 调用系统的 getsockopt()
HPSOCKET_API int SYS_GetSocketOption ( SOCKET sock , int level , int name , LPVOID val , int * len ) ;
// 调用系统的 ioctlsocket()
HPSOCKET_API int SYS_IoctlSocket ( SOCKET sock , long cmd , ULONG * arg ) ;
// 调用系统的 WSAIoctl()
HPSOCKET_API int SYS_WSAIoctl ( SOCKET sock , DWORD dwIoControlCode , LPVOID lpvInBuffer , DWORD cbInBuffer , LPVOID lpvOutBuffer , DWORD cbOutBuffer , LPDWORD lpcbBytesReturned ) ;
// 设置 socket 选项: IPPROTO_TCP -> TCP_NODELAY
HPSOCKET_API int SYS_SSO_NoDelay ( SOCKET sock , BOOL bNoDelay ) ;
// 设置 socket 选项: SOL_SOCKET -> SO_DONTLINGER
HPSOCKET_API int SYS_SSO_DontLinger ( SOCKET sock , BOOL bDont ) ;
// 设置 socket 选项: SOL_SOCKET -> SO_LINGER
HPSOCKET_API int SYS_SSO_Linger ( SOCKET sock , USHORT l_onoff , USHORT l_linger ) ;
// 设置 socket 选项: SOL_SOCKET -> SO_RCVBUF
HPSOCKET_API int SYS_SSO_RecvBuffSize ( SOCKET sock , int size ) ;
// 设置 socket 选项: SOL_SOCKET -> SO_SNDBUF
HPSOCKET_API int SYS_SSO_SendBuffSize ( SOCKET sock , int size ) ;
// 设置 socket 选项: SOL_SOCKET -> SO_RCVTIMEO
HPSOCKET_API int SYS_SSO_RecvTimeOut ( SOCKET sock , int ms ) ;
// 设置 socket 选项: SOL_SOCKET -> SO_SNDTIMEO
HPSOCKET_API int SYS_SSO_SendTimeOut ( SOCKET sock , int ms ) ;
// 设置 socket 选项: SOL_SOCKET -> SO_EXCLUSIVEADDRUSE / SO_REUSEADDR
HPSOCKET_API int SYS_SSO_ReuseAddress ( SOCKET sock , EnReuseAddressPolicy opt ) ;
// 设置 socket 选项: SOL_SOCKET -> SO_EXCLUSIVEADDRUSE
HPSOCKET_API int SYS_SSO_ExclusiveAddressUse ( SOCKET sock , BOOL bExclusive ) ;
// 获取 SOCKET 本地地址信息
HPSOCKET_API BOOL SYS_GetSocketLocalAddress ( SOCKET socket , TCHAR lpszAddress [ ] , int & iAddressLen , USHORT & usPort ) ;
// 获取 SOCKET 远程地址信息
HPSOCKET_API BOOL SYS_GetSocketRemoteAddress ( SOCKET socket , TCHAR lpszAddress [ ] , int & iAddressLen , USHORT & usPort ) ;
/* 枚举主机 IP 地址 */
HPSOCKET_API BOOL SYS_EnumHostIPAddresses ( LPCTSTR lpszHost , EnIPAddrType enType , LPTIPAddr * * lpppIPAddr , int & iIPAddrCount ) ;
/* 释放 LPTIPAddr* */
HPSOCKET_API BOOL SYS_FreeHostIPAddresses ( LPTIPAddr * lppIPAddr ) ;
/* 检查字符串是否符合 IP 地址格式 */
HPSOCKET_API BOOL SYS_IsIPAddress ( LPCTSTR lpszAddress , EnIPAddrType * penType = nullptr ) ;
/* 通过主机名获取 IP 地址 */
HPSOCKET_API BOOL SYS_GetIPAddress ( LPCTSTR lpszHost , TCHAR lpszIP [ ] , int & iIPLenth , EnIPAddrType & enType ) ;
/* 64 位网络字节序转主机字节序 */
HPSOCKET_API ULONGLONG SYS_NToH64 ( ULONGLONG value ) ;
/* 64 位主机字节序转网络字节序 */
HPSOCKET_API ULONGLONG SYS_HToN64 ( ULONGLONG value ) ;
/* 短整型高低字节交换 */
HPSOCKET_API USHORT SYS_SwapEndian16 ( USHORT value ) ;
/* 长整型高低字节交换 */
HPSOCKET_API DWORD SYS_SwapEndian32 ( DWORD value ) ;
/* 检查是否小端字节序 */
HPSOCKET_API BOOL SYS_IsLittleEndian ( ) ;
/* 分配内存 */
HPSOCKET_API LPBYTE SYS_Malloc ( int size ) ;
/* 重新分配内存 */
HPSOCKET_API LPBYTE SYS_Realloc ( LPBYTE p , int size ) ;
/* 释放内存 */
HPSOCKET_API VOID SYS_Free ( LPBYTE p ) ;
/* 分配内存块 */
HPSOCKET_API LPVOID SYS_Calloc ( int number , int size ) ;
// CP_XXX -> UNICODE
HPSOCKET_API BOOL SYS_CodePageToUnicodeEx ( int iCodePage , const char szSrc [ ] , int iSrcLength , WCHAR szDest [ ] , int & iDestLength ) ;
// UNICODE -> CP_XXX
HPSOCKET_API BOOL SYS_UnicodeToCodePageEx ( int iCodePage , const WCHAR szSrc [ ] , int iSrcLength , char szDest [ ] , int & iDestLength ) ;
// GBK -> UNICODE
HPSOCKET_API BOOL SYS_GbkToUnicodeEx ( const char szSrc [ ] , int iSrcLength , WCHAR szDest [ ] , int & iDestLength ) ;
// UNICODE -> GBK
HPSOCKET_API BOOL SYS_UnicodeToGbkEx ( const WCHAR szSrc [ ] , int iSrcLength , char szDest [ ] , int & iDestLength ) ;
// UTF8 -> UNICODE
HPSOCKET_API BOOL SYS_Utf8ToUnicodeEx ( const char szSrc [ ] , int iSrcLength , WCHAR szDest [ ] , int & iDestLength ) ;
// UNICODE -> UTF8
HPSOCKET_API BOOL SYS_UnicodeToUtf8Ex ( const WCHAR szSrc [ ] , int iSrcLength , char szDest [ ] , int & iDestLength ) ;
// GBK -> UTF8
HPSOCKET_API BOOL SYS_GbkToUtf8Ex ( const char szSrc [ ] , int iSrcLength , char szDest [ ] , int & iDestLength ) ;
// UTF8 -> GBK
HPSOCKET_API BOOL SYS_Utf8ToGbkEx ( const char szSrc [ ] , int iSrcLength , char szDest [ ] , int & iDestLength ) ;
// CP_XXX -> UNICODE
HPSOCKET_API BOOL SYS_CodePageToUnicode ( int iCodePage , const char szSrc [ ] , WCHAR szDest [ ] , int & iDestLength ) ;
// UNICODE -> CP_XXX
HPSOCKET_API BOOL SYS_UnicodeToCodePage ( int iCodePage , const WCHAR szSrc [ ] , char szDest [ ] , int & iDestLength ) ;
// GBK -> UNICODE
HPSOCKET_API BOOL SYS_GbkToUnicode ( const char szSrc [ ] , WCHAR szDest [ ] , int & iDestLength ) ;
// UNICODE -> GBK
HPSOCKET_API BOOL SYS_UnicodeToGbk ( const WCHAR szSrc [ ] , char szDest [ ] , int & iDestLength ) ;
// UTF8 -> UNICODE
HPSOCKET_API BOOL SYS_Utf8ToUnicode ( const char szSrc [ ] , WCHAR szDest [ ] , int & iDestLength ) ;
// UNICODE -> UTF8
HPSOCKET_API BOOL SYS_UnicodeToUtf8 ( const WCHAR szSrc [ ] , char szDest [ ] , int & iDestLength ) ;
// GBK -> UTF8
HPSOCKET_API BOOL SYS_GbkToUtf8 ( const char szSrc [ ] , char szDest [ ] , int & iDestLength ) ;
// UTF8 -> GBK
HPSOCKET_API BOOL SYS_Utf8ToGbk ( const char szSrc [ ] , char szDest [ ] , int & iDestLength ) ;
// 计算 Base64 编码后长度
HPSOCKET_API DWORD SYS_GuessBase64EncodeBound ( DWORD dwSrcLen ) ;
// 计算 Base64 解码后长度
HPSOCKET_API DWORD SYS_GuessBase64DecodeBound ( const BYTE * lpszSrc , DWORD dwSrcLen ) ;
// Base64 编码( 返回值: 0 -> 成功,-3 -> 输入数据不正确,-5 -> 输出缓冲区不足)
HPSOCKET_API int SYS_Base64Encode ( const BYTE * lpszSrc , DWORD dwSrcLen , BYTE * lpszDest , DWORD & dwDestLen ) ;
// Base64 解码( 返回值: 0 -> 成功,-3 -> 输入数据不正确,-5 -> 输出缓冲区不足)
HPSOCKET_API int SYS_Base64Decode ( const BYTE * lpszSrc , DWORD dwSrcLen , BYTE * lpszDest , DWORD & dwDestLen ) ;
// 计算 URL 编码后长度
HPSOCKET_API DWORD SYS_GuessUrlEncodeBound ( const BYTE * lpszSrc , DWORD dwSrcLen ) ;
// 计算 URL 解码后长度
HPSOCKET_API DWORD SYS_GuessUrlDecodeBound ( const BYTE * lpszSrc , DWORD dwSrcLen ) ;
// URL 编码( 返回值: 0 -> 成功,-3 -> 输入数据不正确,-5 -> 输出缓冲区不足)
HPSOCKET_API int SYS_UrlEncode ( BYTE * lpszSrc , DWORD dwSrcLen , BYTE * lpszDest , DWORD & dwDestLen ) ;
// URL 解码( 返回值: 0 -> 成功,-3 -> 输入数据不正确,-5 -> 输出缓冲区不足)
HPSOCKET_API int SYS_UrlDecode ( BYTE * lpszSrc , DWORD dwSrcLen , BYTE * lpszDest , DWORD & dwDestLen ) ;
# ifdef _ZLIB_SUPPORT
// 普通压缩( 返回值: 0 -> 成功,-3 -> 输入数据不正确,-5 -> 输出缓冲区不足)
// ( 默认参数: iLevel -> -1, iMethod -> 8, iWindowBits -> 15, iMemLevel -> 8, iStrategy -> 0)
HPSOCKET_API int SYS_Compress ( const BYTE * lpszSrc , DWORD dwSrcLen , BYTE * lpszDest , DWORD & dwDestLen ) ;
// 高级压缩( 返回值: 0 -> 成功,-3 -> 输入数据不正确,-5 -> 输出缓冲区不足)
//( 默认参数: iLevel -> -1, iMethod -> 8, iWindowBits -> 15, iMemLevel -> 8, iStrategy -> 0)
HPSOCKET_API int SYS_CompressEx ( const BYTE * lpszSrc , DWORD dwSrcLen , BYTE * lpszDest , DWORD & dwDestLen , int iLevel = - 1 , int iMethod = 8 , int iWindowBits = 15 , int iMemLevel = 8 , int iStrategy = 0 ) ;
// 普通解压( 返回值: 0 -> 成功,-3 -> 输入数据不正确,-5 -> 输出缓冲区不足)
//( 默认参数: iWindowBits -> 15)
HPSOCKET_API int SYS_Uncompress ( const BYTE * lpszSrc , DWORD dwSrcLen , BYTE * lpszDest , DWORD & dwDestLen ) ;
// 高级解压( 返回值: 0 -> 成功,-3 -> 输入数据不正确,-5 -> 输出缓冲区不足)
//( 默认参数: iWindowBits -> 15)
HPSOCKET_API int SYS_UncompressEx ( const BYTE * lpszSrc , DWORD dwSrcLen , BYTE * lpszDest , DWORD & dwDestLen , int iWindowBits = 15 ) ;
// 推测压缩结果长度
HPSOCKET_API DWORD SYS_GuessCompressBound ( DWORD dwSrcLen , BOOL bGZip = FALSE ) ;
// Gzip 压缩( 返回值: 0 -> 成功,-3 -> 输入数据不正确,-5 -> 输出缓冲区不足)
HPSOCKET_API int SYS_GZipCompress ( const BYTE * lpszSrc , DWORD dwSrcLen , BYTE * lpszDest , DWORD & dwDestLen ) ;
// Gzip 解压( 返回值: 0 -> 成功,-3 -> 输入数据不正确,-5 -> 输出缓冲区不足)
HPSOCKET_API int SYS_GZipUncompress ( const BYTE * lpszSrc , DWORD dwSrcLen , BYTE * lpszDest , DWORD & dwDestLen ) ;
// 推测 Gzip 解压结果长度(如果返回 0 或不合理值则说明输入内容并非有效的 Gzip 格式)
HPSOCKET_API DWORD SYS_GZipGuessUncompressBound ( const BYTE * lpszSrc , DWORD dwSrcLen ) ;
# endif
# ifdef _BROTLI_SUPPORT
// Brotli 压缩( 返回值: 0 -> 成功,-3 -> 输入数据不正确,-5 -> 输出缓冲区不足)
// ( 默认参数: iQuality -> 11, iWindow -> 22, iMode -> 0)
HPSOCKET_API int SYS_BrotliCompress ( const BYTE * lpszSrc , DWORD dwSrcLen , BYTE * lpszDest , DWORD & dwDestLen ) ;
// Brotli 高级压缩( 返回值: 0 -> 成功,-3 -> 输入数据不正确,-5 -> 输出缓冲区不足)
//( 默认参数: iQuality -> 11, iWindow -> 22, iMode -> 0)
HPSOCKET_API int SYS_BrotliCompressEx ( const BYTE * lpszSrc , DWORD dwSrcLen , BYTE * lpszDest , DWORD & dwDestLen , int iQuality = 11 , int iWindow = 22 , int iMode = 0 ) ;
// Brotli 解压( 返回值: 0 -> 成功,-3 -> 输入数据不正确,-5 -> 输出缓冲区不足)
HPSOCKET_API int SYS_BrotliUncompress ( const BYTE * lpszSrc , DWORD dwSrcLen , BYTE * lpszDest , DWORD & dwDestLen ) ;
// Brotli 推测压缩结果长度
HPSOCKET_API DWORD SYS_BrotliGuessCompressBound ( DWORD dwSrcLen ) ;
# endif
/*****************************************************************************************************************************************************/
/******************************************************************** HTTP Exports *******************************************************************/
/*****************************************************************************************************************************************************/
# ifdef _HTTP_SUPPORT
// 创建 IHttpServer 对象
HPSOCKET_API IHttpServer * HP_Create_HttpServer ( IHttpServerListener * pListener ) ;
// 创建 IHttpAgent 对象
HPSOCKET_API IHttpAgent * HP_Create_HttpAgent ( IHttpAgentListener * pListener ) ;
// 创建 IHttpClient 对象
HPSOCKET_API IHttpClient * HP_Create_HttpClient ( IHttpClientListener * pListener ) ;
// 创建 IHttpSyncClient 对象
HPSOCKET_API IHttpSyncClient * HP_Create_HttpSyncClient ( IHttpClientListener * pListener = nullptr ) ;
// 销毁 IHttpServer 对象
HPSOCKET_API void HP_Destroy_HttpServer ( IHttpServer * pServer ) ;
// 销毁 IHttpAgent 对象
HPSOCKET_API void HP_Destroy_HttpAgent ( IHttpAgent * pAgent ) ;
// 销毁 IHttpClient 对象
HPSOCKET_API void HP_Destroy_HttpClient ( IHttpClient * pClient ) ;
// 销毁 IHttpSyncClient 对象
HPSOCKET_API void HP_Destroy_HttpSyncClient ( IHttpSyncClient * pClient ) ;
// IHttpServer 对象创建器
2025-10-15 04:32:59 +08:00
struct HttpServer_Creator {
static IHttpServer * Create ( IHttpServerListener * pListener )
{
return HP_Create_HttpServer ( pListener ) ;
}
static void Destroy ( IHttpServer * pServer )
{
HP_Destroy_HttpServer ( pServer ) ;
}
2025-05-03 20:57:22 +08:00
} ;
// IHttpAgent 对象创建器
2025-10-15 04:32:59 +08:00
struct HttpAgent_Creator {
static IHttpAgent * Create ( IHttpAgentListener * pListener )
{
return HP_Create_HttpAgent ( pListener ) ;
}
static void Destroy ( IHttpAgent * pAgent )
{
HP_Destroy_HttpAgent ( pAgent ) ;
}
2025-05-03 20:57:22 +08:00
} ;
// IHttpClient 对象创建器
2025-10-15 04:32:59 +08:00
struct HttpClient_Creator {
static IHttpClient * Create ( IHttpClientListener * pListener )
{
return HP_Create_HttpClient ( pListener ) ;
}
static void Destroy ( IHttpClient * pClient )
{
HP_Destroy_HttpClient ( pClient ) ;
}
2025-05-03 20:57:22 +08:00
} ;
// IHttpSyncClient 对象创建器
2025-10-15 04:32:59 +08:00
struct HttpSyncClient_Creator {
static IHttpSyncClient * Create ( IHttpClientListener * pListener = nullptr )
{
return HP_Create_HttpSyncClient ( pListener ) ;
}
static void Destroy ( IHttpSyncClient * pClient )
{
HP_Destroy_HttpSyncClient ( pClient ) ;
}
2025-05-03 20:57:22 +08:00
} ;
// IHttpServer 对象智能指针
typedef CHPObjectPtr < IHttpServer , IHttpServerListener , HttpServer_Creator > CHttpServerPtr ;
// IHttpAgent 对象智能指针
typedef CHPObjectPtr < IHttpAgent , IHttpAgentListener , HttpAgent_Creator > CHttpAgentPtr ;
// IHttpClient 对象智能指针
typedef CHPObjectPtr < IHttpClient , IHttpClientListener , HttpClient_Creator > CHttpClientPtr ;
// IHttpSyncClient 对象智能指针
typedef CHPObjectPtr < IHttpSyncClient , IHttpClientListener , HttpSyncClient_Creator > CHttpSyncClientPtr ;
/**************************************************************************/
/*************************** HTTP Cookie 管理方法 **************************/
/* 从文件加载 Cookie */
HPSOCKET_API BOOL HP_HttpCookie_MGR_LoadFromFile ( LPCSTR lpszFile , BOOL bKeepExists = TRUE ) ;
/* 保存 Cookie 到文件 */
HPSOCKET_API BOOL HP_HttpCookie_MGR_SaveToFile ( LPCSTR lpszFile , BOOL bKeepExists = TRUE ) ;
/* 清理 Cookie */
HPSOCKET_API BOOL HP_HttpCookie_MGR_ClearCookies ( LPCSTR lpszDomain = nullptr , LPCSTR lpszPath = nullptr ) ;
/* 清理过期 Cookie */
HPSOCKET_API BOOL HP_HttpCookie_MGR_RemoveExpiredCookies ( LPCSTR lpszDomain = nullptr , LPCSTR lpszPath = nullptr ) ;
/* 设置 Cookie */
HPSOCKET_API BOOL HP_HttpCookie_MGR_SetCookie ( LPCSTR lpszName , LPCSTR lpszValue , LPCSTR lpszDomain , LPCSTR lpszPath , int iMaxAge = - 1 , BOOL bHttpOnly = FALSE , BOOL bSecure = FALSE , int enSameSite = 0 , BOOL bOnlyUpdateValueIfExists = TRUE ) ;
/* 删除 Cookie */
HPSOCKET_API BOOL HP_HttpCookie_MGR_DeleteCookie ( LPCSTR lpszDomain , LPCSTR lpszPath , LPCSTR lpszName ) ;
/* 设置是否允许第三方 Cookie */
HPSOCKET_API void HP_HttpCookie_MGR_SetEnableThirdPartyCookie ( BOOL bEnableThirdPartyCookie = TRUE ) ;
/* 检查是否允许第三方 Cookie */
HPSOCKET_API BOOL HP_HttpCookie_MGR_IsEnableThirdPartyCookie ( ) ;
/* Cookie expires 字符串转换为整数 */
HPSOCKET_API BOOL HP_HttpCookie_HLP_ParseExpires ( LPCSTR lpszExpires , __time64_t & tmExpires ) ;
/* 整数转换为 Cookie expires 字符串 */
HPSOCKET_API BOOL HP_HttpCookie_HLP_MakeExpiresStr ( char lpszBuff [ ] , int & iBuffLen , __time64_t tmExpires ) ;
/* 生成 Cookie 字符串 */
HPSOCKET_API BOOL HP_HttpCookie_HLP_ToString ( char lpszBuff [ ] , int & iBuffLen , LPCSTR lpszName , LPCSTR lpszValue , LPCSTR lpszDomain , LPCSTR lpszPath , int iMaxAge /*= -1*/ , BOOL bHttpOnly /*= FALSE*/ , BOOL bSecure /*= FALSE*/ , int enSameSite /*= 0*/ ) ;
/* 获取当前 UTC 时间 */
HPSOCKET_API __time64_t HP_HttpCookie_HLP_CurrentUTCTime ( ) ;
/* Max-Age -> expires */
HPSOCKET_API __time64_t HP_HttpCookie_HLP_MaxAgeToExpires ( int iMaxAge ) ;
/* expires -> Max-Age */
HPSOCKET_API int HP_HttpCookie_HLP_ExpiresToMaxAge ( __time64_t tmExpires ) ;
/*****************************************************************************************************************************************************/
/************************************************************* HTTP Global Function Exports **********************************************************/
/*****************************************************************************************************************************************************/
# endif
/*****************************************************************************************************************************************************/
/**************************************************************** Thread Pool Exports ****************************************************************/
/*****************************************************************************************************************************************************/
// 创建 IHPThreadPool 对象
HPSOCKET_API IHPThreadPool * HP_Create_ThreadPool ( IHPThreadPoolListener * pListener = nullptr ) ;
// 销毁 IHPThreadPool 对象
HPSOCKET_API void HP_Destroy_ThreadPool ( IHPThreadPool * pThreadPool ) ;
/*
* 名 称 : 创 建 TSocketTask 对 象
* 描 述 : 创 建 任 务 对 象 , 该 对 象 最 终 需 由 HP_Destroy_SocketTaskObj ( ) 销 毁
2025-10-15 04:32:59 +08:00
*
2025-05-03 20:57:22 +08:00
* 参 数 : fnTaskProc - - 任 务 处 理 函 数
* pSender - - 发 起 对 象
* dwConnID - - 连 接 ID
* pBuffer - - 数 据 缓 冲 区
* iBuffLen - - 数 据 缓 冲 区 长 度
* enBuffType - - 数 据 缓 冲 区 类 型 ( 默 认 : TBT_COPY )
* TBT_COPY : ( 深 拷 贝 ) pBuffer 复 制 到 TSocketTask 对 象 。 此 后 TSocketTask 对 象 与 pBuffer 不 再 有 任 何 关 联
* - > 适 用 于 pBuffer 不 大 或 pBuffer 生 命 周 期 不 受 控 的 场 景
* TBT_REFER : ( 浅 拷 贝 ) pBuffer 不 复 制 到 TSocketTask 对 象 , 需 确 保 TSocketTask 对 象 生 命 周 期 内 pBuffer 必 须 有 效
* - > 适 用 于 pBuffer 较 大 或 pBuffer 可 重 用 , 并 且 pBuffer 生 命 周 期 受 控 的 场 景
* TBT_ATTACH : ( 附 属 ) 执 行 浅 拷 贝 , 但 TSocketTask 对 象 会 获 得 pBuffer 的 所 有 权 , 并 负 责 释 放 pBuffer , 避 免 多 次 缓 冲 区 拷 贝
* - > 注 意 : pBuffer 必 须 由 SYS_Malloc ( ) / SYS_Calloc ( ) 函 数 分 配 才 能 使 用 本 类 型 , 否 则 可 能 会 发 生 内 存 访 问 错 误
* wParam - - 自 定 义 参 数
* lParam - - 自 定 义 参 数
* 返 回 值 : LPTSocketTask
*/
HPSOCKET_API LPTSocketTask HP_Create_SocketTaskObj ( Fn_SocketTaskProc fnTaskProc , PVOID pSender , CONNID dwConnID , LPCBYTE pBuffer , INT iBuffLen , EnTaskBufferType enBuffType = TBT_COPY , WPARAM wParam = 0 , LPARAM lParam = 0 ) ;
// 销毁 TSocketTask 对象
HPSOCKET_API void HP_Destroy_SocketTaskObj ( LPTSocketTask pTask ) ;
// IHPThreadPool 对象创建器
2025-10-15 04:32:59 +08:00
struct HPThreadPool_Creator {
static IHPThreadPool * Create ( IHPThreadPoolListener * pListener = nullptr )
{
return HP_Create_ThreadPool ( pListener ) ;
}
static void Destroy ( IHPThreadPool * pThreadPool )
{
HP_Destroy_ThreadPool ( pThreadPool ) ;
}
2025-05-03 20:57:22 +08:00
} ;
// IHPThreadPool 对象智能指针
typedef CHPObjectPtr < IHPThreadPool , IHPThreadPoolListener , HPThreadPool_Creator > CHPThreadPoolPtr ;
/*****************************************************************************************************************************************************/
/********************************************************* Compressor / Decompressor Exports *********************************************************/
/*****************************************************************************************************************************************************/
/* 销毁压缩器对象 */
HPSOCKET_API void HP_Destroy_Compressor ( IHPCompressor * pCompressor ) ;
/* 销毁解压器对象 */
HPSOCKET_API void HP_Destroy_Decompressor ( IHPDecompressor * pDecompressor ) ;
# ifdef _ZLIB_SUPPORT
/* 创建 ZLib 压缩器对象 */
HPSOCKET_API IHPCompressor * HP_Create_ZLibCompressor ( Fn_CompressDataCallback fnCallback , int iWindowBits = 15 , int iLevel = - 1 , int iMethod = 8 , int iMemLevel = 8 , int iStrategy = 0 , DWORD dwBuffSize = 16 * 1024 ) ;
/* 创建 GZip 压缩器对象 */
HPSOCKET_API IHPCompressor * HP_Create_GZipCompressor ( Fn_CompressDataCallback fnCallback , int iLevel = - 1 , int iMethod = 8 , int iMemLevel = 8 , int iStrategy = 0 , DWORD dwBuffSize = 16 * 1024 ) ;
/* 创建 ZLib 解压器对象 */
HPSOCKET_API IHPDecompressor * HP_Create_ZLibDecompressor ( Fn_DecompressDataCallback fnCallback , int iWindowBits = 15 , DWORD dwBuffSize = 16 * 1024 ) ;
/* 创建 GZip 解压器对象 */
HPSOCKET_API IHPDecompressor * HP_Create_GZipDecompressor ( Fn_DecompressDataCallback fnCallback , DWORD dwBuffSize = 16 * 1024 ) ;
# endif
# ifdef _BROTLI_SUPPORT
/* 创建 Brotli 压缩器对象 */
HPSOCKET_API IHPCompressor * HP_Create_BrotliCompressor ( Fn_CompressDataCallback fnCallback , int iQuality = 11 , int iWindow = 22 , int iMode = 0 , DWORD dwBuffSize = 16 * 1024 ) ;
/* 创建 Brotli 解压器对象 */
HPSOCKET_API IHPDecompressor * HP_Create_BrotliDecompressor ( Fn_DecompressDataCallback fnCallback , DWORD dwBuffSize = 16 * 1024 ) ;
# endif