开源的socket服务端客户端,支持C# C++

HPSocket4C-SSL.h 11KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229
  1. /*
  2. * Copyright: JessMA Open Source (ldcsaa@gmail.com)
  3. *
  4. * Version : 4.1.3
  5. * Author : Bruce Liang
  6. * Website : http://www.jessma.org
  7. * Project : https://github.com/ldcsaa
  8. * Blog : http://www.cnblogs.com/ldcsaa
  9. * Wiki : http://www.oschina.net/p/hp-socket
  10. * QQ Group : 75375912
  11. *
  12. * Licensed under the Apache License, Version 2.0 (the "License");
  13. * you may not use this file except in compliance with the License.
  14. * You may obtain a copy of the License at
  15. *
  16. * http://www.apache.org/licenses/LICENSE-2.0
  17. *
  18. * Unless required by applicable law or agreed to in writing, software
  19. * distributed under the License is distributed on an "AS IS" BASIS,
  20. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  21. * See the License for the specific language governing permissions and
  22. * limitations under the License.
  23. */
  24. /******************************************************************************
  25. Module: HPSocket-SSL for C
  26. Desc: 导出纯 C 函数,让其它语言(如:C / C# / Delphi 等)能方便地使用 HPSocket SSL
  27. Usage:
  28. 方法一:
  29. --------------------------------------------------------------------------------------
  30. 0. (C/C++ 程序)包含 HPTypeDef.h / HPSocket4C.h / HPSocket4C-SSL.h 头文件
  31. 1. 启动通信前调用 SSL_Initialize() 函数初始化 SSL 全局环境参数,并确保方法返回成功
  32. 2. 使用 HPSocket SSL 组件执行通信(参考:HPSocket4C.h)
  33. 3. 通信结束后调用 SSL_Cleanup() 函数清理 SSL 全局运行环境
  34. 方法二:
  35. --------------------------------------------------------------------------------------
  36. 1. 应用程序把需要用到的导出函数封装到特定语言的包装类中
  37. 2. 通过包装类封装后,以面向对象的方式使用 HPSocket SSL
  38. Release:
  39. <-- 动态链接库 -->
  40. 1. x86/HPSocket4C-SSL.dll - (32位/MBCS/Release)
  41. 2. x86/HPSocket4C-SSL_D.dll - (32位/MBCS/DeBug)
  42. 3. x86/HPSocket4C-SSL_U.dll - (32位/UNICODE/Release)
  43. 4. x86/HPSocket4C-SSL_UD.dll - (32位/UNICODE/DeBug)
  44. 5. x64/HPSocket4C-SSL.dll - (64位/MBCS/Release)
  45. 6. x64/HPSocket4C-SSL_D.dll - (64位/MBCS/DeBug)
  46. 7. x64/HPSocket4C-SSL_U.dll - (64位/UNICODE/Release)
  47. 8. x64/HPSocket4C-SSL_UD.dll - (64位/UNICODE/DeBug)
  48. <-- 静态链接库 -->
  49. !!注意!!:使用 HPSocket 静态库时,需要在工程属性中定义预处理宏 -> HPSOCKET_STATIC_LIB
  50. 1. x86/static/HPSocket4C-SSL.lib - (32位/MBCS/Release)
  51. 2. x86/static/HPSocket4C-SSL_D.lib - (32位/MBCS/DeBug)
  52. 3. x86/static/HPSocket4C-SSL_U.lib - (32位/UNICODE/Release)
  53. 4. x86/static/HPSocket4C-SSL_UD.lib - (32位/UNICODE/DeBug)
  54. 5. x64/static/HPSocket4C-SSL.lib - (64位/MBCS/Release)
  55. 6. x64/static/HPSocket4C-SSL_D.lib - (64位/MBCS/DeBug)
  56. 7. x64/static/HPSocket4C-SSL_U.lib - (64位/UNICODE/Release)
  57. 8. x64/static/HPSocket4C-SSL_UD.lib - (64位/UNICODE/DeBug)
  58. ******************************************************************************/
  59. #pragma once
  60. #ifndef _SSL_SUPPORT
  61. #define _SSL_SUPPORT
  62. #endif
  63. #include "HPSocket4C.h"
  64. /************************************************************************
  65. 名称:定义 SSL Socket 对象指针类型别名
  66. 描述:把 SSL Socket 对象指针定义为更直观的别名
  67. ************************************************************************/
  68. typedef HP_Object HP_SSLServer;
  69. typedef HP_Object HP_SSLAgent;
  70. typedef HP_Object HP_SSLClient;
  71. typedef HP_Object HP_SSLPullServer;
  72. typedef HP_Object HP_SSLPullAgent;
  73. typedef HP_Object HP_SSLPullClient;
  74. typedef HP_Object HP_SSLPackServer;
  75. typedef HP_Object HP_SSLPackAgent;
  76. typedef HP_Object HP_SSLPackClient;
  77. typedef HP_Object HP_HttpsServer;
  78. typedef HP_Object HP_HttpsAgent;
  79. typedef HP_Object HP_HttpsClient;
  80. typedef HP_Object HP_HttpsSyncClient;
  81. /*****************************************************************************************************************************************************/
  82. /******************************************************************** SSL Exports ********************************************************************/
  83. /*****************************************************************************************************************************************************/
  84. /********************************************************/
  85. /************** HPSocket4C-SSL 对象创建函数 **************/
  86. // 创建 HP_SSLServer 对象
  87. HPSOCKET_API HP_SSLServer __stdcall Create_HP_SSLServer(HP_TcpServerListener pListener);
  88. // 创建 HP_SSLAgent 对象
  89. HPSOCKET_API HP_SSLAgent __stdcall Create_HP_SSLAgent(HP_TcpAgentListener pListener);
  90. // 创建 HP_SSLClient 对象
  91. HPSOCKET_API HP_SSLClient __stdcall Create_HP_SSLClient(HP_TcpClientListener pListener);
  92. // 创建 HP_SSLPullServer 对象
  93. HPSOCKET_API HP_SSLPullServer __stdcall Create_HP_SSLPullServer(HP_TcpPullServerListener pListener);
  94. // 创建 HP_SSLPullAgent 对象
  95. HPSOCKET_API HP_SSLPullAgent __stdcall Create_HP_SSLPullAgent(HP_TcpPullAgentListener pListener);
  96. // 创建 HP_SSLPullClient 对象
  97. HPSOCKET_API HP_SSLPullClient __stdcall Create_HP_SSLPullClient(HP_TcpPullClientListener pListener);
  98. // 创建 HP_SSLPackServer 对象
  99. HPSOCKET_API HP_SSLPackServer __stdcall Create_HP_SSLPackServer(HP_TcpServerListener pListener);
  100. // 创建 HP_SSLPackAgent 对象
  101. HPSOCKET_API HP_SSLPackAgent __stdcall Create_HP_SSLPackAgent(HP_TcpAgentListener pListener);
  102. // 创建 HP_SSLPackClient 对象
  103. HPSOCKET_API HP_SSLPackClient __stdcall Create_HP_SSLPackClient(HP_TcpClientListener pListener);
  104. // 销毁 HP_SSLServer 对象
  105. HPSOCKET_API void __stdcall Destroy_HP_SSLServer(HP_SSLServer pServer);
  106. // 销毁 HP_SSLAgent 对象
  107. HPSOCKET_API void __stdcall Destroy_HP_SSLAgent(HP_SSLAgent pAgent);
  108. // 销毁 HP_SSLClient 对象
  109. HPSOCKET_API void __stdcall Destroy_HP_SSLClient(HP_SSLClient pClient);
  110. // 销毁 HP_SSLPullServer 对象
  111. HPSOCKET_API void __stdcall Destroy_HP_SSLPullServer(HP_SSLPullServer pServer);
  112. // 销毁 HP_SSLPullAgent 对象
  113. HPSOCKET_API void __stdcall Destroy_HP_SSLPullAgent(HP_SSLPullAgent pAgent);
  114. // 销毁 HP_SSLPullClient 对象
  115. HPSOCKET_API void __stdcall Destroy_HP_SSLPullClient(HP_SSLPullClient pClient);
  116. // 销毁 HP_SSLPackServer 对象
  117. HPSOCKET_API void __stdcall Destroy_HP_SSLPackServer(HP_SSLPackServer pServer);
  118. // 销毁 HP_SSLPackAgent 对象
  119. HPSOCKET_API void __stdcall Destroy_HP_SSLPackAgent(HP_SSLPackAgent pAgent);
  120. // 销毁 HP_SSLPackClient 对象
  121. HPSOCKET_API void __stdcall Destroy_HP_SSLPackClient(HP_SSLPackClient pClient);
  122. /*****************************************************************************************************************************************************/
  123. /******************************************************************** HTTPS Exports ******************************************************************/
  124. /*****************************************************************************************************************************************************/
  125. /****************************************************/
  126. /**************** HTTPS 对象创建函数 *****************/
  127. // 创建 HP_HttpsServer 对象
  128. HPSOCKET_API HP_HttpsServer __stdcall Create_HP_HttpsServer(HP_HttpServerListener pListener);
  129. // 创建 HP_HttpsAgent 对象
  130. HPSOCKET_API HP_HttpsAgent __stdcall Create_HP_HttpsAgent(HP_HttpAgentListener pListener);
  131. // 创建 HP_HttpsClient 对象
  132. HPSOCKET_API HP_HttpsClient __stdcall Create_HP_HttpsClient(HP_HttpClientListener pListener);
  133. // 创建 HP_HttpSyncClient 对象
  134. HPSOCKET_API HP_HttpsSyncClient __stdcall Create_HP_HttpsSyncClient();
  135. // 销毁 HP_HttpsServer 对象
  136. HPSOCKET_API void __stdcall Destroy_HP_HttpsServer(HP_HttpsServer pServer);
  137. // 销毁 HP_HttpsAgent 对象
  138. HPSOCKET_API void __stdcall Destroy_HP_HttpsAgent(HP_HttpsAgent pAgent);
  139. // 销毁 HP_HttpsClient 对象
  140. HPSOCKET_API void __stdcall Destroy_HP_HttpsClient(HP_HttpsClient pClient);
  141. // 销毁 HP_HttpSyncClient 对象
  142. HPSOCKET_API void __stdcall Destroy_HP_HttpsSyncClient(HP_HttpsSyncClient pClient);
  143. /*****************************************************************************************************************************************************/
  144. /*************************************************************** Global Function Exports *************************************************************/
  145. /*****************************************************************************************************************************************************/
  146. /***************************************************************************************/
  147. /************************************ SSL 初始化方法 ************************************/
  148. /*
  149. * 名称:初始化 SSL 全局环境参数
  150. * 描述:SSL 全局环境参数必须在 SSL 通信组件启动前完成初始化,否则启动失败
  151. *
  152. * 参数: enSessionMode -- SSL 工作模式(参考 EnSSLSessionMode)
  153. * iVerifyMode -- SSL 验证模式(参考 EnSSLVerifyMode)
  154. * lpszPemCertFile -- 证书文件(客户端可选)
  155. * lpszPemKeyFile -- 私钥文件(客户端可选)
  156. * lpszKeyPasswod -- 私钥密码(没有密码则为空)
  157. * lpszCAPemCertFileOrPath -- CA 证书文件或目录(单向验证或客户端可选)
  158. * fnServerNameCallback -- SNI 回调函数指针(可选,只用于服务端)
  159. *
  160. * 返回值: TRUE -- 成功
  161. * FALSE -- 失败,可通过 SYS_GetLastError() 获取失败原因
  162. */
  163. HPSOCKET_API BOOL __stdcall HP_SSL_Initialize(En_HP_SSLSessionMode enSessionMode, int iVerifyMode /* SSL_VM_NONE */, LPCTSTR lpszPemCertFile /* nullptr */, LPCTSTR lpszPemKeyFile /* nullptr */, LPCTSTR lpszKeyPasswod /* nullptr */, LPCTSTR lpszCAPemCertFileOrPath /* nullptr */, HP_Fn_SNI_ServerNameCallback fnServerNameCallback /* nullptr */);
  164. /*
  165. * 名称:增加 SNI 主机证书(只用于服务端)
  166. * 描述:SSL 服务端在 Initialize() 成功后可以调用本方法增加多个 SNI 主机证书
  167. *
  168. * 参数: iVerifyMode -- SSL 验证模式(参考 EnSSLVerifyMode)
  169. * lpszPemCertFile -- 证书文件
  170. * lpszPemKeyFile -- 私钥文件
  171. * lpszKeyPasswod -- 私钥密码(没有密码则为空)
  172. * lpszCAPemCertFileOrPath -- CA 证书文件或目录(单向验证可选)
  173. *
  174. * 返回值: 正数 -- 成功,并返回 SNI 主机证书对应的索引,该索引用于在 SNI 回调函数中定位 SNI 主机
  175. * 负数 -- 失败,可通过 SYS_GetLastError() 获取失败原因
  176. */
  177. HPSOCKET_API int __stdcall HP_SSL_AddServerContext(int iVerifyMode, LPCTSTR lpszPemCertFile, LPCTSTR lpszPemKeyFile, LPCTSTR lpszKeyPasswod /* nullptr */, LPCTSTR lpszCAPemCertFileOrPath /* nullptr */);
  178. /*
  179. * 名称:清理 SSL 全局运行环境
  180. * 描述:清理 SSL 全局运行环境,回收 SSL 相关内存
  181. * 1、应用程序退出时会自动调用本方法
  182. * 2、当要重新设置 SSL 全局环境参数时,需要先调用本方法清理原先的环境参数
  183. *
  184. * 参数: 无
  185. *
  186. * 返回值:无
  187. */
  188. HPSOCKET_API void __stdcall HP_SSL_Cleanup();
  189. /*
  190. * 名称:清理线程局部环境 SSL 资源
  191. * 描述:任何一个操作 SSL 的线程,通信结束时都需要清理线程局部环境 SSL 资源
  192. * 1、主线程和 HP-Socket 工作线程在通信结束时会自动清理线程局部环境 SSL 资源。因此,一般情况下不必手工调用本方法
  193. * 2、特殊情况下,当自定义线程参与 HP-Socket 通信操作并检查到 SSL 内存泄漏时,需在每次通信结束时自定义线程调用本方法
  194. *
  195. * 参数: dwThreadID -- 线程 ID(0:当前线程)
  196. *
  197. * 返回值:无
  198. */
  199. HPSOCKET_API void __stdcall HP_SSL_RemoveThreadLocalState(DWORD dwThreadID);
  200. /* 检查 SSL 全局运行环境是否初始化完成 */
  201. HPSOCKET_API BOOL __stdcall HP_SSL_IsValid();