HPSocket.h 33 KB

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