HPSocket.h 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818
  1. /*
  2. * Copyright: JessMA Open Source (ldcsaa@gmail.com)
  3. *
  4. * Author : Bruce Liang
  5. * Website : https://github.com/ldcsaa
  6. * Project : https://github.com/ldcsaa/HP-Socket
  7. * Blog : http://www.cnblogs.com/ldcsaa
  8. * Wiki : http://www.oschina.net/p/hp-socket
  9. * QQ Group : 44636872, 75375912
  10. *
  11. * Licensed under the Apache License, Version 2.0 (the "License");
  12. * you may not use this file except in compliance with the License.
  13. * You may obtain a copy of the License at
  14. *
  15. * http://www.apache.org/licenses/LICENSE-2.0
  16. *
  17. * Unless required by applicable law or agreed to in writing, software
  18. * distributed under the License is distributed on an "AS IS" BASIS,
  19. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  20. * See the License for the specific language governing permissions and
  21. * limitations under the License.
  22. */
  23. /******************************************************************************
  24. Module: HPSocket
  25. Usage:
  26. 方法一:
  27. --------------------------------------------------------------------------------------
  28. 0. 应用程序包含 HPTypeDef.h / SocketInterface.h / HPSocket.h 头文件
  29. 1. 调用 HP_Create_Xxx() 函数创建 HPSocket 对象
  30. 2. 使用完毕后调用 HP_Destroy_Xxx() 函数销毁 HPSocket 对象
  31. 方法二:
  32. --------------------------------------------------------------------------------------
  33. 0. 应用程序包含 SocketInterface.h 和 HPSocket.h 头文件
  34. 1. 创建 CXxxPtr 智能指针,通过智能指针使用 HPSocket 对象
  35. Release:
  36. <-- 动态链接库 -->
  37. 1. x86/libhpsocket.so - (32位/MBCS/Release)
  38. 2. x86/libhpsocket_d.so - (32位/MBCS/DeBug)
  39. 3. x64/libhpsocket.so - (64位/MBCS/Release)
  40. 4. x64/libhpsocket_d.so - (64位/MBCS/DeBug)
  41. <-- 静态链接库 -->
  42. 1. x86/static/libhpsocket.a - (32位/MBCS/Release)
  43. 2. x86/static/libhpsocket_d.a - (32位/MBCS/DeBug)
  44. 3. x64/static/libhpsocket.a - (64位/MBCS/Release)
  45. 4. x64/static/libhpsocket_d.a - (64位/MBCS/DeBug)
  46. ******************************************************************************/
  47. #pragma once
  48. #include "SocketInterface.h"
  49. /*****************************************************************************************************************************************************/
  50. /****************************************************************** TCP/UDP Exports ******************************************************************/
  51. /*****************************************************************************************************************************************************/
  52. /**************************************************/
  53. /************** HPSocket 对象智能指针 **************/
  54. template<class T, class _Listener, class _Creator> class CHPObjectPtr
  55. {
  56. public:
  57. CHPObjectPtr& Reset(T* pObj = nullptr)
  58. {
  59. if(pObj != m_pObj)
  60. {
  61. if(m_pObj)
  62. _Creator::Destroy(m_pObj);
  63. m_pObj = pObj;
  64. }
  65. return *this;
  66. }
  67. CHPObjectPtr& Attach(T* pObj)
  68. {
  69. return Reset(pObj);
  70. }
  71. T* Detach()
  72. {
  73. T* pObj = m_pObj;
  74. m_pObj = nullptr;
  75. return pObj;
  76. }
  77. BOOL IsValid () const {return m_pObj != nullptr ;}
  78. T* Get () const {return m_pObj ;}
  79. T* operator -> () const {return m_pObj ;}
  80. operator T* () const {return m_pObj ;}
  81. CHPObjectPtr& operator = (T* pObj) {return Reset(pObj) ;}
  82. public:
  83. CHPObjectPtr(_Listener* pListener = nullptr)
  84. {
  85. m_pObj = _Creator::Create(pListener);
  86. }
  87. CHPObjectPtr(BOOL bCreate, _Listener* pListener = nullptr)
  88. {
  89. m_pObj = bCreate ? _Creator::Create(pListener) : nullptr;
  90. }
  91. virtual ~CHPObjectPtr()
  92. {
  93. Reset();
  94. }
  95. private:
  96. CHPObjectPtr(const CHPObjectPtr&) = delete;
  97. CHPObjectPtr& operator = (const CHPObjectPtr&) = delete;
  98. protected:
  99. T* m_pObj;
  100. };
  101. /**************************************************/
  102. /**************** HPSocket 导出函数 ****************/
  103. // 创建 ITcpServer 对象
  104. HPSOCKET_API ITcpServer* HP_Create_TcpServer(ITcpServerListener* pListener);
  105. // 创建 ITcpAgent 对象
  106. HPSOCKET_API ITcpAgent* HP_Create_TcpAgent(ITcpAgentListener* pListener);
  107. // 创建 ITcpClient 对象
  108. HPSOCKET_API ITcpClient* HP_Create_TcpClient(ITcpClientListener* pListener);
  109. // 创建 ITcpPullServer 对象
  110. HPSOCKET_API ITcpPullServer* HP_Create_TcpPullServer(ITcpServerListener* pListener);
  111. // 创建 ITcpPullAgent 对象
  112. HPSOCKET_API ITcpPullAgent* HP_Create_TcpPullAgent(ITcpAgentListener* pListener);
  113. // 创建 ITcpPullClient 对象
  114. HPSOCKET_API ITcpPullClient* HP_Create_TcpPullClient(ITcpClientListener* pListener);
  115. // 创建 ITcpPackServer 对象
  116. HPSOCKET_API ITcpPackServer* HP_Create_TcpPackServer(ITcpServerListener* pListener);
  117. // 创建 ITcpPackAgent 对象
  118. HPSOCKET_API ITcpPackAgent* HP_Create_TcpPackAgent(ITcpAgentListener* pListener);
  119. // 创建 ITcpPackClient 对象
  120. HPSOCKET_API ITcpPackClient* HP_Create_TcpPackClient(ITcpClientListener* pListener);
  121. // 销毁 ITcpServer 对象
  122. HPSOCKET_API void HP_Destroy_TcpServer(ITcpServer* pServer);
  123. // 销毁 ITcpAgent 对象
  124. HPSOCKET_API void HP_Destroy_TcpAgent(ITcpAgent* pAgent);
  125. // 销毁 ITcpClient 对象
  126. HPSOCKET_API void HP_Destroy_TcpClient(ITcpClient* pClient);
  127. // 销毁 ITcpPullServer 对象
  128. HPSOCKET_API void HP_Destroy_TcpPullServer(ITcpPullServer* pServer);
  129. // 销毁 ITcpPullAgent 对象
  130. HPSOCKET_API void HP_Destroy_TcpPullAgent(ITcpPullAgent* pAgent);
  131. // 销毁 ITcpPullClient 对象
  132. HPSOCKET_API void HP_Destroy_TcpPullClient(ITcpPullClient* pClient);
  133. // 销毁 ITcpPackServer 对象
  134. HPSOCKET_API void HP_Destroy_TcpPackServer(ITcpPackServer* pServer);
  135. // 销毁 ITcpPackAgent 对象
  136. HPSOCKET_API void HP_Destroy_TcpPackAgent(ITcpPackAgent* pAgent);
  137. // 销毁 ITcpPackClient 对象
  138. HPSOCKET_API void HP_Destroy_TcpPackClient(ITcpPackClient* pClient);
  139. #ifdef _UDP_SUPPORT
  140. // 创建 IUdpServer 对象
  141. HPSOCKET_API IUdpServer* HP_Create_UdpServer(IUdpServerListener* pListener);
  142. // 创建 IUdpClient 对象
  143. HPSOCKET_API IUdpClient* HP_Create_UdpClient(IUdpClientListener* pListener);
  144. // 创建 IUdpCast 对象
  145. HPSOCKET_API IUdpCast* HP_Create_UdpCast(IUdpCastListener* pListener);
  146. // 创建 IUdpNode 对象
  147. HPSOCKET_API IUdpNode* HP_Create_UdpNode(IUdpNodeListener* pListener);
  148. // 创建 IUdpArqServer 对象
  149. HPSOCKET_API IUdpArqServer* HP_Create_UdpArqServer(IUdpServerListener* pListener);
  150. // 创建 IUdpArqClient 对象
  151. HPSOCKET_API IUdpArqClient* HP_Create_UdpArqClient(IUdpClientListener* pListener);
  152. // 销毁 IUdpServer 对象
  153. HPSOCKET_API void HP_Destroy_UdpServer(IUdpServer* pServer);
  154. // 销毁 IUdpClient 对象
  155. HPSOCKET_API void HP_Destroy_UdpClient(IUdpClient* pClient);
  156. // 销毁 IUdpCast 对象
  157. HPSOCKET_API void HP_Destroy_UdpCast(IUdpCast* pCast);
  158. // 销毁 IUdpNode 对象
  159. HPSOCKET_API void HP_Destroy_UdpNode(IUdpNode* pNode);
  160. // 销毁 IUdpArqServer 对象
  161. HPSOCKET_API void HP_Destroy_UdpArqServer(IUdpArqServer* pServer);
  162. // 销毁 IUdpArqClient 对象
  163. HPSOCKET_API void HP_Destroy_UdpArqClient(IUdpArqClient* pClient);
  164. #endif
  165. // ITcpServer 对象创建器
  166. struct TcpServer_Creator
  167. {
  168. static ITcpServer* Create(ITcpServerListener* pListener)
  169. {
  170. return HP_Create_TcpServer(pListener);
  171. }
  172. static void Destroy(ITcpServer* pServer)
  173. {
  174. HP_Destroy_TcpServer(pServer);
  175. }
  176. };
  177. // ITcpAgent 对象创建器
  178. struct TcpAgent_Creator
  179. {
  180. static ITcpAgent* Create(ITcpAgentListener* pListener)
  181. {
  182. return HP_Create_TcpAgent(pListener);
  183. }
  184. static void Destroy(ITcpAgent* pAgent)
  185. {
  186. HP_Destroy_TcpAgent(pAgent);
  187. }
  188. };
  189. // ITcpClient 对象创建器
  190. struct TcpClient_Creator
  191. {
  192. static ITcpClient* Create(ITcpClientListener* pListener)
  193. {
  194. return HP_Create_TcpClient(pListener);
  195. }
  196. static void Destroy(ITcpClient* pClient)
  197. {
  198. HP_Destroy_TcpClient(pClient);
  199. }
  200. };
  201. // ITcpPullServer 对象创建器
  202. struct TcpPullServer_Creator
  203. {
  204. static ITcpPullServer* Create(ITcpServerListener* pListener)
  205. {
  206. return HP_Create_TcpPullServer(pListener);
  207. }
  208. static void Destroy(ITcpPullServer* pServer)
  209. {
  210. HP_Destroy_TcpPullServer(pServer);
  211. }
  212. };
  213. // ITcpPullAgent 对象创建器
  214. struct TcpPullAgent_Creator
  215. {
  216. static ITcpPullAgent* Create(ITcpAgentListener* pListener)
  217. {
  218. return HP_Create_TcpPullAgent(pListener);
  219. }
  220. static void Destroy(ITcpPullAgent* pAgent)
  221. {
  222. HP_Destroy_TcpPullAgent(pAgent);
  223. }
  224. };
  225. // ITcpPullClient 对象创建器
  226. struct TcpPullClient_Creator
  227. {
  228. static ITcpPullClient* Create(ITcpClientListener* pListener)
  229. {
  230. return HP_Create_TcpPullClient(pListener);
  231. }
  232. static void Destroy(ITcpPullClient* pClient)
  233. {
  234. HP_Destroy_TcpPullClient(pClient);
  235. }
  236. };
  237. // ITcpPackServer 对象创建器
  238. struct TcpPackServer_Creator
  239. {
  240. static ITcpPackServer* Create(ITcpServerListener* pListener)
  241. {
  242. return HP_Create_TcpPackServer(pListener);
  243. }
  244. static void Destroy(ITcpPackServer* pServer)
  245. {
  246. HP_Destroy_TcpPackServer(pServer);
  247. }
  248. };
  249. // ITcpPackAgent 对象创建器
  250. struct TcpPackAgent_Creator
  251. {
  252. static ITcpPackAgent* Create(ITcpAgentListener* pListener)
  253. {
  254. return HP_Create_TcpPackAgent(pListener);
  255. }
  256. static void Destroy(ITcpPackAgent* pAgent)
  257. {
  258. HP_Destroy_TcpPackAgent(pAgent);
  259. }
  260. };
  261. // ITcpPackClient 对象创建器
  262. struct TcpPackClient_Creator
  263. {
  264. static ITcpPackClient* Create(ITcpClientListener* pListener)
  265. {
  266. return HP_Create_TcpPackClient(pListener);
  267. }
  268. static void Destroy(ITcpPackClient* pClient)
  269. {
  270. HP_Destroy_TcpPackClient(pClient);
  271. }
  272. };
  273. // ITcpServer 对象智能指针
  274. typedef CHPObjectPtr<ITcpServer, ITcpServerListener, TcpServer_Creator> CTcpServerPtr;
  275. // ITcpAgent 对象智能指针
  276. typedef CHPObjectPtr<ITcpAgent, ITcpAgentListener, TcpAgent_Creator> CTcpAgentPtr;
  277. // ITcpClient 对象智能指针
  278. typedef CHPObjectPtr<ITcpClient, ITcpClientListener, TcpClient_Creator> CTcpClientPtr;
  279. // ITcpPullServer 对象智能指针
  280. typedef CHPObjectPtr<ITcpPullServer, ITcpServerListener, TcpPullServer_Creator> CTcpPullServerPtr;
  281. // ITcpPullAgent 对象智能指针
  282. typedef CHPObjectPtr<ITcpPullAgent, ITcpAgentListener, TcpPullAgent_Creator> CTcpPullAgentPtr;
  283. // ITcpPullClient 对象智能指针
  284. typedef CHPObjectPtr<ITcpPullClient, ITcpClientListener, TcpPullClient_Creator> CTcpPullClientPtr;
  285. // ITcpPackServer 对象智能指针
  286. typedef CHPObjectPtr<ITcpPackServer, ITcpServerListener, TcpPackServer_Creator> CTcpPackServerPtr;
  287. // ITcpPackAgent 对象智能指针
  288. typedef CHPObjectPtr<ITcpPackAgent, ITcpAgentListener, TcpPackAgent_Creator> CTcpPackAgentPtr;
  289. // ITcpPackClient 对象智能指针
  290. typedef CHPObjectPtr<ITcpPackClient, ITcpClientListener, TcpPackClient_Creator> CTcpPackClientPtr;
  291. #ifdef _UDP_SUPPORT
  292. // IUdpServer 对象创建器
  293. struct UdpServer_Creator
  294. {
  295. static IUdpServer* Create(IUdpServerListener* pListener)
  296. {
  297. return HP_Create_UdpServer(pListener);
  298. }
  299. static void Destroy(IUdpServer* pServer)
  300. {
  301. HP_Destroy_UdpServer(pServer);
  302. }
  303. };
  304. // IUdpClient 对象创建器
  305. struct UdpClient_Creator
  306. {
  307. static IUdpClient* Create(IUdpClientListener* pListener)
  308. {
  309. return HP_Create_UdpClient(pListener);
  310. }
  311. static void Destroy(IUdpClient* pClient)
  312. {
  313. HP_Destroy_UdpClient(pClient);
  314. }
  315. };
  316. // IUdpCast 对象创建器
  317. struct UdpCast_Creator
  318. {
  319. static IUdpCast* Create(IUdpCastListener* pListener)
  320. {
  321. return HP_Create_UdpCast(pListener);
  322. }
  323. static void Destroy(IUdpCast* pCast)
  324. {
  325. HP_Destroy_UdpCast(pCast);
  326. }
  327. };
  328. // IUdpNode 对象创建器
  329. struct UdpNode_Creator
  330. {
  331. static IUdpNode* Create(IUdpNodeListener* pListener)
  332. {
  333. return HP_Create_UdpNode(pListener);
  334. }
  335. static void Destroy(IUdpNode* pNode)
  336. {
  337. HP_Destroy_UdpNode(pNode);
  338. }
  339. };
  340. // IUdpArqServer 对象创建器
  341. struct UdpArqServer_Creator
  342. {
  343. static IUdpArqServer* Create(IUdpServerListener* pListener)
  344. {
  345. return HP_Create_UdpArqServer(pListener);
  346. }
  347. static void Destroy(IUdpArqServer* pServer)
  348. {
  349. HP_Destroy_UdpArqServer(pServer);
  350. }
  351. };
  352. // IUdpArqClient 对象创建器
  353. struct UdpArqClient_Creator
  354. {
  355. static IUdpArqClient* Create(IUdpClientListener* pListener)
  356. {
  357. return HP_Create_UdpArqClient(pListener);
  358. }
  359. static void Destroy(IUdpArqClient* pClient)
  360. {
  361. HP_Destroy_UdpArqClient(pClient);
  362. }
  363. };
  364. // IUdpServer 对象智能指针
  365. typedef CHPObjectPtr<IUdpServer, IUdpServerListener, UdpServer_Creator> CUdpServerPtr;
  366. // IUdpClient 对象智能指针
  367. typedef CHPObjectPtr<IUdpClient, IUdpClientListener, UdpClient_Creator> CUdpClientPtr;
  368. // IUdpCast 对象智能指针
  369. typedef CHPObjectPtr<IUdpCast, IUdpCastListener, UdpCast_Creator> CUdpCastPtr;
  370. // IUdpNode 对象智能指针
  371. typedef CHPObjectPtr<IUdpNode, IUdpNodeListener, UdpNode_Creator> CUdpNodePtr;
  372. // IUdpArqServer 对象智能指针
  373. typedef CHPObjectPtr<IUdpArqServer, IUdpServerListener, UdpArqServer_Creator> CUdpArqServerPtr;
  374. // IUdpArqClient 对象智能指针
  375. typedef CHPObjectPtr<IUdpArqClient, IUdpClientListener, UdpArqClient_Creator> CUdpArqClientPtr;
  376. #endif
  377. /*****************************************************************************************************************************************************/
  378. /*************************************************************** Global Function Exports *************************************************************/
  379. /*****************************************************************************************************************************************************/
  380. // 获取 HPSocket 版本号(4 个字节分别为:主版本号,子版本号,修正版本号,构建编号)
  381. HPSOCKET_API DWORD HP_GetHPSocketVersion();
  382. // 获取错误描述文本
  383. HPSOCKET_API LPCTSTR HP_GetSocketErrorDesc(EnSocketError enCode);
  384. // 调用系统的 errno 方法获取系统错误代码
  385. HPSOCKET_API DWORD SYS_GetLastError();
  386. // 调用系统的 strerror() 方法获取系统错误代码描述
  387. HPSOCKET_API LPCSTR SYS_GetLastErrorStr();
  388. // 调用系统的 setsockopt()
  389. HPSOCKET_API int SYS_SetSocketOption(SOCKET sock, int level, int name, LPVOID val, int len);
  390. // 调用系统的 getsockopt()
  391. HPSOCKET_API int SYS_GetSocketOption(SOCKET sock, int level, int name, LPVOID val, int* len);
  392. // 调用系统的 ioctlsocket()
  393. HPSOCKET_API int SYS_IoctlSocket(SOCKET sock, long cmd, ULONG* arg);
  394. // 调用系统的 fcntl() 设置 F_SETFL 属性
  395. HPSOCKET_API BOOL SYS_fcntl_SETFL(FD fd, INT fl, BOOL bSet = TRUE);
  396. // 设置 FD 选项:O_NONBLOCK
  397. HPSOCKET_API int SYS_SSO_NoBlock(SOCKET sock, BOOL bNoBlock = TRUE);
  398. // 设置 socket 选项:IPPROTO_TCP -> TCP_NODELAY
  399. HPSOCKET_API int SYS_SSO_NoDelay(SOCKET sock, BOOL bNoDelay = TRUE);
  400. // 设置 socket 选项:SOL_SOCKET -> SO_DONTLINGER
  401. HPSOCKET_API int SYS_SSO_DontLinger(SOCKET sock, BOOL bDont = TRUE);
  402. // 设置 socket 选项:SOL_SOCKET -> SO_LINGER
  403. HPSOCKET_API int SYS_SSO_Linger(SOCKET sock, USHORT l_onoff, USHORT l_linger);
  404. // 设置 socket 选项:SOL_SOCKET -> SO_RCVBUF
  405. HPSOCKET_API int SYS_SSO_RecvBuffSize(SOCKET sock, int size);
  406. // 设置 socket 选项:SOL_SOCKET -> SO_SNDBUF
  407. HPSOCKET_API int SYS_SSO_SendBuffSize(SOCKET sock, int size);
  408. // 设置 socket 选项:SOL_SOCKET -> SO_RCVTIMEO
  409. HPSOCKET_API int SYS_SSO_RecvTimeOut(SOCKET sock, int ms);
  410. // 设置 socket 选项:SOL_SOCKET -> SO_SNDTIMEO
  411. HPSOCKET_API int SYS_SSO_SendTimeOut(SOCKET sock, int ms);
  412. // 设置 socket 选项:SOL_SOCKET -> SO_REUSEADDR / SO_REUSEPORT
  413. HPSOCKET_API int SYS_SSO_ReuseAddress(SOCKET sock, EnReuseAddressPolicy opt);
  414. // 获取 SOCKET 本地地址信息
  415. HPSOCKET_API BOOL SYS_GetSocketLocalAddress(SOCKET socket, TCHAR lpszAddress[], int& iAddressLen, USHORT& usPort);
  416. // 获取 SOCKET 远程地址信息
  417. HPSOCKET_API BOOL SYS_GetSocketRemoteAddress(SOCKET socket, TCHAR lpszAddress[], int& iAddressLen, USHORT& usPort);
  418. /* 枚举主机 IP 地址 */
  419. HPSOCKET_API BOOL SYS_EnumHostIPAddresses(LPCTSTR lpszHost, EnIPAddrType enType, LPTIPAddr** lpppIPAddr, int& iIPAddrCount);
  420. /* 释放 LPTIPAddr* */
  421. HPSOCKET_API BOOL SYS_FreeHostIPAddresses(LPTIPAddr* lppIPAddr);
  422. /* 检查字符串是否符合 IP 地址格式 */
  423. HPSOCKET_API BOOL SYS_IsIPAddress(LPCTSTR lpszAddress, EnIPAddrType* penType = nullptr);
  424. /* 通过主机名获取 IP 地址 */
  425. HPSOCKET_API BOOL SYS_GetIPAddress(LPCTSTR lpszHost, TCHAR lpszIP[], int& iIPLenth, EnIPAddrType& enType);
  426. /* 64 位网络字节序转主机字节序 */
  427. HPSOCKET_API ULONGLONG SYS_NToH64(ULONGLONG value);
  428. /* 64 位主机字节序转网络字节序 */
  429. HPSOCKET_API ULONGLONG SYS_HToN64(ULONGLONG value);
  430. /* 短整型高低字节交换 */
  431. HPSOCKET_API USHORT SYS_SwapEndian16(USHORT value);
  432. /* 长整型高低字节交换 */
  433. HPSOCKET_API DWORD SYS_SwapEndian32(DWORD value);
  434. /* 检查是否小端字节序 */
  435. HPSOCKET_API BOOL SYS_IsLittleEndian();
  436. /* 分配内存 */
  437. HPSOCKET_API LPBYTE SYS_Malloc(int size);
  438. /* 重新分配内存 */
  439. HPSOCKET_API LPBYTE SYS_Realloc(LPBYTE p, int size);
  440. /* 释放内存 */
  441. HPSOCKET_API VOID SYS_Free(LPBYTE p);
  442. /* 分配内存块 */
  443. HPSOCKET_API LPVOID SYS_Calloc(int number, int size);
  444. // 计算 Base64 编码后长度
  445. HPSOCKET_API DWORD SYS_GuessBase64EncodeBound(DWORD dwSrcLen);
  446. // 计算 Base64 解码后长度
  447. HPSOCKET_API DWORD SYS_GuessBase64DecodeBound(const BYTE* lpszSrc, DWORD dwSrcLen);
  448. // Base64 编码(返回值:0 -> 成功,-3 -> 输入数据不正确,-5 -> 输出缓冲区不足)
  449. HPSOCKET_API int SYS_Base64Encode(const BYTE* lpszSrc, DWORD dwSrcLen, BYTE* lpszDest, DWORD& dwDestLen);
  450. // Base64 解码(返回值:0 -> 成功,-3 -> 输入数据不正确,-5 -> 输出缓冲区不足)
  451. HPSOCKET_API int SYS_Base64Decode(const BYTE* lpszSrc, DWORD dwSrcLen, BYTE* lpszDest, DWORD& dwDestLen);
  452. // 计算 URL 编码后长度
  453. HPSOCKET_API DWORD SYS_GuessUrlEncodeBound(const BYTE* lpszSrc, DWORD dwSrcLen);
  454. // 计算 URL 解码后长度
  455. HPSOCKET_API DWORD SYS_GuessUrlDecodeBound(const BYTE* lpszSrc, DWORD dwSrcLen);
  456. // URL 编码(返回值:0 -> 成功,-3 -> 输入数据不正确,-5 -> 输出缓冲区不足)
  457. HPSOCKET_API int SYS_UrlEncode(BYTE* lpszSrc, DWORD dwSrcLen, BYTE* lpszDest, DWORD& dwDestLen);
  458. // URL 解码(返回值:0 -> 成功,-3 -> 输入数据不正确,-5 -> 输出缓冲区不足)
  459. HPSOCKET_API int SYS_UrlDecode(BYTE* lpszSrc, DWORD dwSrcLen, BYTE* lpszDest, DWORD& dwDestLen);
  460. #ifdef _ZLIB_SUPPORT
  461. // 普通压缩(返回值:0 -> 成功,-3 -> 输入数据不正确,-5 -> 输出缓冲区不足)
  462. // (默认参数:iLevel -> -1,iMethod -> 8,iWindowBits -> 15,iMemLevel -> 8,iStrategy -> 0)
  463. HPSOCKET_API int SYS_Compress(const BYTE* lpszSrc, DWORD dwSrcLen, BYTE* lpszDest, DWORD& dwDestLen);
  464. // 高级压缩(返回值:0 -> 成功,-3 -> 输入数据不正确,-5 -> 输出缓冲区不足)
  465. //(默认参数:iLevel -> -1,iMethod -> 8,iWindowBits -> 15,iMemLevel -> 8,iStrategy -> 0)
  466. 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);
  467. // 普通解压(返回值:0 -> 成功,-3 -> 输入数据不正确,-5 -> 输出缓冲区不足)
  468. //(默认参数:iWindowBits -> 15)
  469. HPSOCKET_API int SYS_Uncompress(const BYTE* lpszSrc, DWORD dwSrcLen, BYTE* lpszDest, DWORD& dwDestLen);
  470. // 高级解压(返回值:0 -> 成功,-3 -> 输入数据不正确,-5 -> 输出缓冲区不足)
  471. //(默认参数:iWindowBits -> 15)
  472. HPSOCKET_API int SYS_UncompressEx(const BYTE* lpszSrc, DWORD dwSrcLen, BYTE* lpszDest, DWORD& dwDestLen, int iWindowBits = 15);
  473. // 推测压缩结果长度
  474. HPSOCKET_API DWORD SYS_GuessCompressBound(DWORD dwSrcLen, BOOL bGZip = FALSE);
  475. // Gzip 压缩(返回值:0 -> 成功,-3 -> 输入数据不正确,-5 -> 输出缓冲区不足)
  476. HPSOCKET_API int SYS_GZipCompress(const BYTE* lpszSrc, DWORD dwSrcLen, BYTE* lpszDest, DWORD& dwDestLen);
  477. // Gzip 解压(返回值:0 -> 成功,-3 -> 输入数据不正确,-5 -> 输出缓冲区不足)
  478. HPSOCKET_API int SYS_GZipUncompress(const BYTE* lpszSrc, DWORD dwSrcLen, BYTE* lpszDest, DWORD& dwDestLen);
  479. // 推测 Gzip 解压结果长度(如果返回 0 或不合理值则说明输入内容并非有效的 Gzip 格式)
  480. HPSOCKET_API DWORD SYS_GZipGuessUncompressBound(const BYTE* lpszSrc, DWORD dwSrcLen);
  481. #endif
  482. #ifdef _BROTLI_SUPPORT
  483. // Brotli 压缩(返回值:0 -> 成功,-3 -> 输入数据不正确,-5 -> 输出缓冲区不足)
  484. // (默认参数:iQuality -> 11,iWindow -> 22,iMode -> 0)
  485. HPSOCKET_API int SYS_BrotliCompress(const BYTE* lpszSrc, DWORD dwSrcLen, BYTE* lpszDest, DWORD& dwDestLen);
  486. // Brotli 高级压缩(返回值:0 -> 成功,-3 -> 输入数据不正确,-5 -> 输出缓冲区不足)
  487. //(默认参数:iQuality -> 11,iWindow -> 22,iMode -> 0)
  488. HPSOCKET_API int SYS_BrotliCompressEx(const BYTE* lpszSrc, DWORD dwSrcLen, BYTE* lpszDest, DWORD& dwDestLen, int iQuality = 11, int iWindow = 22, int iMode = 0);
  489. // Brotli 解压(返回值:0 -> 成功,-3 -> 输入数据不正确,-5 -> 输出缓冲区不足)
  490. HPSOCKET_API int SYS_BrotliUncompress(const BYTE* lpszSrc, DWORD dwSrcLen, BYTE* lpszDest, DWORD& dwDestLen);
  491. // Brotli 推测压缩结果长度
  492. HPSOCKET_API DWORD SYS_BrotliGuessCompressBound(DWORD dwSrcLen);
  493. #endif
  494. #ifdef _ICONV_SUPPORT
  495. // Charset A -> Charset B
  496. HPSOCKET_API BOOL SYS_CharsetConvert(LPCSTR lpszFromCharset, LPCSTR lpszToCharset, LPCSTR lpszInBuf, int iInBufLen, LPSTR lpszOutBuf, int& iOutBufLen);
  497. // GBK -> UNICODE
  498. HPSOCKET_API BOOL SYS_GbkToUnicodeEx(const char szSrc[], int iSrcLength, WCHAR szDest[], int& iDestLength);
  499. // UNICODE -> GBK
  500. HPSOCKET_API BOOL SYS_UnicodeToGbkEx(const WCHAR szSrc[], int iSrcLength, char szDest[], int& iDestLength);
  501. // UTF8 -> UNICODE
  502. HPSOCKET_API BOOL SYS_Utf8ToUnicodeEx(const char szSrc[], int iSrcLength, WCHAR szDest[], int& iDestLength);
  503. // UNICODE -> UTF8
  504. HPSOCKET_API BOOL SYS_UnicodeToUtf8Ex(const WCHAR szSrc[], int iSrcLength, char szDest[], int& iDestLength);
  505. // GBK -> UTF8
  506. HPSOCKET_API BOOL SYS_GbkToUtf8Ex(const char szSrc[], int iSrcLength, char szDest[], int& iDestLength);
  507. // UTF8 -> GBK
  508. HPSOCKET_API BOOL SYS_Utf8ToGbkEx(const char szSrc[], int iSrcLength, char szDest[], int& iDestLength);
  509. // GBK -> UNICODE
  510. HPSOCKET_API BOOL SYS_GbkToUnicode(const char szSrc[], WCHAR szDest[], int& iDestLength);
  511. // UNICODE -> GBK
  512. HPSOCKET_API BOOL SYS_UnicodeToGbk(const WCHAR szSrc[], char szDest[], int& iDestLength);
  513. // UTF8 -> UNICODE
  514. HPSOCKET_API BOOL SYS_Utf8ToUnicode(const char szSrc[], WCHAR szDest[], int& iDestLength);
  515. // UNICODE -> UTF8
  516. HPSOCKET_API BOOL SYS_UnicodeToUtf8(const WCHAR szSrc[], char szDest[], int& iDestLength);
  517. // GBK -> UTF8
  518. HPSOCKET_API BOOL SYS_GbkToUtf8(const char szSrc[], char szDest[], int& iDestLength);
  519. // UTF8 -> GBK
  520. HPSOCKET_API BOOL SYS_Utf8ToGbk(const char szSrc[], char szDest[], int& iDestLength);
  521. #endif
  522. /*****************************************************************************************************************************************************/
  523. /******************************************************************** HTTP Exports *******************************************************************/
  524. /*****************************************************************************************************************************************************/
  525. #ifdef _HTTP_SUPPORT
  526. // 创建 IHttpServer 对象
  527. HPSOCKET_API IHttpServer* HP_Create_HttpServer(IHttpServerListener* pListener);
  528. // 创建 IHttpAgent 对象
  529. HPSOCKET_API IHttpAgent* HP_Create_HttpAgent(IHttpAgentListener* pListener);
  530. // 创建 IHttpClient 对象
  531. HPSOCKET_API IHttpClient* HP_Create_HttpClient(IHttpClientListener* pListener);
  532. // 创建 IHttpSyncClient 对象
  533. HPSOCKET_API IHttpSyncClient* HP_Create_HttpSyncClient(IHttpClientListener* pListener = nullptr);
  534. // 销毁 IHttpServer 对象
  535. HPSOCKET_API void HP_Destroy_HttpServer(IHttpServer* pServer);
  536. // 销毁 IHttpAgent 对象
  537. HPSOCKET_API void HP_Destroy_HttpAgent(IHttpAgent* pAgent);
  538. // 销毁 IHttpClient 对象
  539. HPSOCKET_API void HP_Destroy_HttpClient(IHttpClient* pClient);
  540. // 销毁 IHttpSyncClient 对象
  541. HPSOCKET_API void HP_Destroy_HttpSyncClient(IHttpSyncClient* pClient);
  542. // IHttpServer 对象创建器
  543. struct HttpServer_Creator
  544. {
  545. static IHttpServer* Create(IHttpServerListener* pListener)
  546. {
  547. return HP_Create_HttpServer(pListener);
  548. }
  549. static void Destroy(IHttpServer* pServer)
  550. {
  551. HP_Destroy_HttpServer(pServer);
  552. }
  553. };
  554. // IHttpAgent 对象创建器
  555. struct HttpAgent_Creator
  556. {
  557. static IHttpAgent* Create(IHttpAgentListener* pListener)
  558. {
  559. return HP_Create_HttpAgent(pListener);
  560. }
  561. static void Destroy(IHttpAgent* pAgent)
  562. {
  563. HP_Destroy_HttpAgent(pAgent);
  564. }
  565. };
  566. // IHttpClient 对象创建器
  567. struct HttpClient_Creator
  568. {
  569. static IHttpClient* Create(IHttpClientListener* pListener)
  570. {
  571. return HP_Create_HttpClient(pListener);
  572. }
  573. static void Destroy(IHttpClient* pClient)
  574. {
  575. HP_Destroy_HttpClient(pClient);
  576. }
  577. };
  578. // IHttpSyncClient 对象创建器
  579. struct HttpSyncClient_Creator
  580. {
  581. static IHttpSyncClient* Create(IHttpClientListener* pListener = nullptr)
  582. {
  583. return HP_Create_HttpSyncClient(pListener);
  584. }
  585. static void Destroy(IHttpSyncClient* pClient)
  586. {
  587. HP_Destroy_HttpSyncClient(pClient);
  588. }
  589. };
  590. // IHttpServer 对象智能指针
  591. typedef CHPObjectPtr<IHttpServer, IHttpServerListener, HttpServer_Creator> CHttpServerPtr;
  592. // IHttpAgent 对象智能指针
  593. typedef CHPObjectPtr<IHttpAgent, IHttpAgentListener, HttpAgent_Creator> CHttpAgentPtr;
  594. // IHttpClient 对象智能指针
  595. typedef CHPObjectPtr<IHttpClient, IHttpClientListener, HttpClient_Creator> CHttpClientPtr;
  596. // IHttpSyncClient 对象智能指针
  597. typedef CHPObjectPtr<IHttpSyncClient, IHttpClientListener, HttpSyncClient_Creator> CHttpSyncClientPtr;
  598. /**************************************************************************/
  599. /*************************** HTTP Cookie 管理方法 **************************/
  600. /* 从文件加载 Cookie */
  601. HPSOCKET_API BOOL HP_HttpCookie_MGR_LoadFromFile(LPCSTR lpszFile, BOOL bKeepExists = TRUE);
  602. /* 保存 Cookie 到文件 */
  603. HPSOCKET_API BOOL HP_HttpCookie_MGR_SaveToFile(LPCSTR lpszFile, BOOL bKeepExists = TRUE);
  604. /* 清理 Cookie */
  605. HPSOCKET_API BOOL HP_HttpCookie_MGR_ClearCookies(LPCSTR lpszDomain = nullptr, LPCSTR lpszPath = nullptr);
  606. /* 清理过期 Cookie */
  607. HPSOCKET_API BOOL HP_HttpCookie_MGR_RemoveExpiredCookies(LPCSTR lpszDomain = nullptr, LPCSTR lpszPath = nullptr);
  608. /* 设置 Cookie */
  609. 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);
  610. /* 删除 Cookie */
  611. HPSOCKET_API BOOL HP_HttpCookie_MGR_DeleteCookie(LPCSTR lpszDomain, LPCSTR lpszPath, LPCSTR lpszName);
  612. /* 设置是否允许第三方 Cookie */
  613. HPSOCKET_API void HP_HttpCookie_MGR_SetEnableThirdPartyCookie(BOOL bEnableThirdPartyCookie = TRUE);
  614. /* 检查是否允许第三方 Cookie */
  615. HPSOCKET_API BOOL HP_HttpCookie_MGR_IsEnableThirdPartyCookie();
  616. /* Cookie expires 字符串转换为整数 */
  617. HPSOCKET_API BOOL HP_HttpCookie_HLP_ParseExpires(LPCSTR lpszExpires, __time64_t& tmExpires);
  618. /* 整数转换为 Cookie expires 字符串 */
  619. HPSOCKET_API BOOL HP_HttpCookie_HLP_MakeExpiresStr(char lpszBuff[], int& iBuffLen, __time64_t tmExpires);
  620. /* 生成 Cookie 字符串 */
  621. 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*/);
  622. /* 获取当前 UTC 时间 */
  623. HPSOCKET_API __time64_t HP_HttpCookie_HLP_CurrentUTCTime();
  624. /* Max-Age -> expires */
  625. HPSOCKET_API __time64_t HP_HttpCookie_HLP_MaxAgeToExpires(int iMaxAge);
  626. /* expires -> Max-Age */
  627. HPSOCKET_API int HP_HttpCookie_HLP_ExpiresToMaxAge(__time64_t tmExpires);
  628. /*****************************************************************************************************************************************************/
  629. /************************************************************* HTTP Global Function Exports **********************************************************/
  630. /*****************************************************************************************************************************************************/
  631. #endif
  632. /*****************************************************************************************************************************************************/
  633. /**************************************************************** Thread Pool Exports ****************************************************************/
  634. /*****************************************************************************************************************************************************/
  635. // 创建 IHPThreadPool 对象
  636. HPSOCKET_API IHPThreadPool* HP_Create_ThreadPool(IHPThreadPoolListener* pListener = nullptr);
  637. // 销毁 IHPThreadPool 对象
  638. HPSOCKET_API void HP_Destroy_ThreadPool(IHPThreadPool* pThreadPool);
  639. /*
  640. * 名称:创建 TSocketTask 对象
  641. * 描述:创建任务对象,该对象最终需由 HP_Destroy_SocketTaskObj() 销毁
  642. *
  643. * 参数: fnTaskProc -- 任务处理函数
  644. * pSender -- 发起对象
  645. * dwConnID -- 连接 ID
  646. * pBuffer -- 数据缓冲区
  647. * iBuffLen -- 数据缓冲区长度
  648. * enBuffType -- 数据缓冲区类型(默认:TBT_COPY)
  649. * TBT_COPY :(深拷贝)pBuffer 复制到 TSocketTask 对象。此后 TSocketTask 对象与 pBuffer 不再有任何关联
  650. * -> 适用于 pBuffer 不大或 pBuffer 生命周期不受控的场景
  651. * TBT_REFER :(浅拷贝)pBuffer 不复制到 TSocketTask 对象,需确保 TSocketTask 对象生命周期内 pBuffer 必须有效
  652. * -> 适用于 pBuffer 较大或 pBuffer 可重用,并且 pBuffer 生命周期受控的场景
  653. * TBT_ATTACH :(附属)执行浅拷贝,但 TSocketTask 对象会获得 pBuffer 的所有权,并负责释放 pBuffer,避免多次缓冲区拷贝
  654. * -> 注意:pBuffer 必须由 SYS_Malloc()/SYS_Calloc() 函数分配才能使用本类型,否则可能会发生内存访问错误
  655. * wParam -- 自定义参数
  656. * lParam -- 自定义参数
  657. * 返回值: LPTSocketTask
  658. */
  659. 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);
  660. // 销毁 TSocketTask 对象
  661. HPSOCKET_API void HP_Destroy_SocketTaskObj(LPTSocketTask pTask);
  662. // IHPThreadPool 对象创建器
  663. struct HPThreadPool_Creator
  664. {
  665. static IHPThreadPool* Create(IHPThreadPoolListener* pListener = nullptr)
  666. {
  667. return HP_Create_ThreadPool(pListener);
  668. }
  669. static void Destroy(IHPThreadPool* pThreadPool)
  670. {
  671. HP_Destroy_ThreadPool(pThreadPool);
  672. }
  673. };
  674. // IHPThreadPool 对象智能指针
  675. typedef CHPObjectPtr<IHPThreadPool, IHPThreadPoolListener, HPThreadPool_Creator> CHPThreadPoolPtr;
  676. /*****************************************************************************************************************************************************/
  677. /********************************************************* Compressor / Decompressor Exports *********************************************************/
  678. /*****************************************************************************************************************************************************/
  679. /* 销毁压缩器对象 */
  680. HPSOCKET_API void HP_Destroy_Compressor(IHPCompressor* pCompressor);
  681. /* 销毁解压器对象 */
  682. HPSOCKET_API void HP_Destroy_Decompressor(IHPDecompressor* pDecompressor);
  683. #ifdef _ZLIB_SUPPORT
  684. /* 创建 ZLib 压缩器对象 */
  685. 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);
  686. /* 创建 GZip 压缩器对象 */
  687. 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);
  688. /* 创建 ZLib 解压器对象 */
  689. HPSOCKET_API IHPDecompressor* HP_Create_ZLibDecompressor(Fn_DecompressDataCallback fnCallback, int iWindowBits = 15, DWORD dwBuffSize = 16 * 1024);
  690. /* 创建 GZip 解压器对象 */
  691. HPSOCKET_API IHPDecompressor* HP_Create_GZipDecompressor(Fn_DecompressDataCallback fnCallback, DWORD dwBuffSize = 16 * 1024);
  692. #endif
  693. #ifdef _BROTLI_SUPPORT
  694. /* 创建 Brotli 压缩器对象 */
  695. HPSOCKET_API IHPCompressor* HP_Create_BrotliCompressor(Fn_CompressDataCallback fnCallback, int iQuality = 11, int iWindow = 22, int iMode = 0, DWORD dwBuffSize = 16 * 1024);
  696. /* 创建 Brotli 解压器对象 */
  697. HPSOCKET_API IHPDecompressor* HP_Create_BrotliDecompressor(Fn_DecompressDataCallback fnCallback, DWORD dwBuffSize = 16 * 1024);
  698. #endif