server_windows.go 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890
  1. //go:build windows
  2. package yu_hpsocket
  3. import yu_sys "gogs.qqck.cn/s/tools/sys"
  4. // Server
  5. // @Description: Server 系列组件底层实现
  6. type Server[T any] struct {
  7. hListener uintptr
  8. hServer uintptr
  9. SSL bool
  10. Extra any // 附加数据
  11. // 事件----------------------------------
  12. onPrepareListen func(t *T, Sender, Listen uintptr) HR
  13. onAccept func(t *T, Sender, ConnID, Client uintptr) HR
  14. onHandShake func(t *T, Sender, ConnID uintptr) HR
  15. onSend func(t *T, Sender, ConnID, Data uintptr, Length uintptr) HR
  16. onReceive func(t *T, Sender, ConnID, Data uintptr, Length uintptr) HR
  17. onClose func(t *T, Sender, ConnID uintptr, Operation SO, ErrorCode int) HR
  18. onShutdown func(t *T, Sender uintptr) HR
  19. }
  20. // isValid
  21. //
  22. // @Description: 对象是否有效
  23. func (t *Server[T]) isValid() bool {
  24. return t.hListener != 0 && t.hServer != 0
  25. }
  26. // Start 名称:启动通信组件
  27. //
  28. // @Description: 启动服务端通信组件,启动完成后可开始接收客户端连接并收发数据
  29. // @param BindAddress 监听地址
  30. // @param Port 监听端口
  31. // @return bool 是否启动成功
  32. func (t *Server[T]) Start(BindAddress string, Port int) bool {
  33. if !t.isValid() {
  34. return false
  35. }
  36. return HP_Server_Start.CallBool(t.hServer, yu_sys.S{yu_sys.Gbk, BindAddress}, Port)
  37. }
  38. // Stop 名称:关闭通信组件
  39. //
  40. // @Description: 关闭服务端通信组件,关闭完成后断开所有客户端连接并释放所有资源
  41. // @return bool 是否成功关闭
  42. func (t *Server[T]) Stop() bool {
  43. if !t.isValid() {
  44. return false
  45. }
  46. return HP_Server_Stop.CallBool(t.hServer)
  47. }
  48. // Wait
  49. //
  50. // @Description: 等待通信组件停止运行
  51. // @param Milliseconds 超时时间(毫秒,默认:-1,永不超时)
  52. // @return bool 超时返回 false
  53. func (t *Server[T]) Wait(Milliseconds int) bool {
  54. if !t.isValid() {
  55. return false
  56. }
  57. return HP_Server_Wait.CallBool(t.hServer, Milliseconds)
  58. }
  59. // Send
  60. //
  61. // @Description: 向指定连接发送数据
  62. // @param ConnID 连接 ID
  63. // @param buf 欲发送的数据
  64. // @return bool 是否发送成功
  65. func (t *Server[T]) Send(ConnID uintptr, buf []byte) bool {
  66. if !t.isValid() {
  67. return false
  68. }
  69. if len(buf) == 0 {
  70. return true
  71. }
  72. return HP_Server_Send.CallBool(t.hServer, ConnID, buf, len(buf))
  73. }
  74. // SendS
  75. //
  76. // @Description: 向指定连接发送数据
  77. // @param ConnID 连接 ID
  78. // @param buf 欲发送的数据
  79. // @return bool 是否发送成功
  80. func (t *Server[T]) SendS(ConnID uintptr, buf string) bool {
  81. if !t.isValid() {
  82. return false
  83. }
  84. if len(buf) == 0 {
  85. return true
  86. }
  87. return HP_Server_Send.CallBool(t.hServer, ConnID, buf, len(buf))
  88. }
  89. // IsSecure
  90. //
  91. // @Description: 检测是否为安全连接(SSL/HTTPS)
  92. func (t *Server[T]) IsSecure() bool {
  93. if !t.isValid() {
  94. return false
  95. }
  96. return HP_Server_IsSecure.CallBool(t.hServer)
  97. }
  98. // Disconnect
  99. //
  100. // @Description: 断开与某个客户端的连接
  101. // @param Force 是否强制断开连接
  102. func (t *Server[T]) Disconnect(ConnID uintptr, Force bool) bool {
  103. if !t.isValid() {
  104. return false
  105. }
  106. return HP_Server_Disconnect.CallBool(t.hServer, ConnID, Force)
  107. }
  108. // DisconnectLongConnections
  109. //
  110. // @Description: 断开超过指定时长的连接
  111. // @param Period 时长(毫秒)
  112. // @param Force 是否强制断开连接
  113. func (t *Server[T]) DisconnectLongConnections(Period uintptr, Force bool) bool {
  114. if !t.isValid() {
  115. return false
  116. }
  117. return HP_Server_DisconnectLongConnections.CallBool(t.hServer, Period, Force)
  118. }
  119. // DisconnectSilenceConnections
  120. //
  121. // @Description: 断开静默连接
  122. // @param Period 时长(毫秒)
  123. // @param Force 是否强制断开连接
  124. func (t *Server[T]) DisconnectSilenceConnections(Period uintptr, Force bool) bool {
  125. if !t.isValid() {
  126. return false
  127. }
  128. return HP_Server_DisconnectSilenceConnections.CallBool(t.hServer, Period, Force)
  129. }
  130. // SetExtra
  131. //
  132. // @Description: 设置连接的附加数据
  133. // @param ConnID 连接 ID
  134. // @param Extra 附加数据
  135. func (t *Server[T]) SetExtra(ConnID, Extra uintptr) (success bool) {
  136. if !t.isValid() {
  137. return
  138. }
  139. return HP_Server_SetConnectionExtra.CallBool(t.hServer, ConnID, Extra)
  140. }
  141. // GetExtra
  142. //
  143. // @Description: 获取连接的附加数据
  144. // @param ConnID 连接 ID
  145. func (t *Server[T]) GetExtra(ConnID uintptr) (Extra uintptr) {
  146. if !t.isValid() {
  147. return
  148. }
  149. HP_Server_GetConnectionExtra.Call(t.hServer, ConnID, &Extra)
  150. return
  151. }
  152. // HasStarted
  153. //
  154. // @Description: 检查通信组件是否已启动
  155. func (t *Server[T]) HasStarted() bool {
  156. if !t.isValid() {
  157. return false
  158. }
  159. return HP_Server_HasStarted.CallBool(t.hServer)
  160. }
  161. // GetState
  162. //
  163. // @Description: 查看通信组件当前状态,SS_ 开头常量
  164. func (t *Server[T]) GetState() SS {
  165. if !t.isValid() {
  166. return SS_STOPPED
  167. }
  168. return SS(HP_Server_GetState.CallUintptr(t.hServer))
  169. }
  170. // GetLastError
  171. //
  172. // @Description: 获取最近一次失败操作的错误代码
  173. func (t *Server[T]) GetLastError() uintptr {
  174. if !t.isValid() {
  175. return 0
  176. }
  177. return HP_Server_GetLastError.CallUintptr(t.hServer)
  178. }
  179. // GetLastErrorDesc
  180. //
  181. // @Description: 获取最近一次失败操作的错误描述
  182. func (t *Server[T]) GetLastErrorDesc() string {
  183. if !t.isValid() {
  184. return "Not Object"
  185. }
  186. return HP_Server_GetLastErrorDesc.CallGbkToUtf8(t.hServer)
  187. }
  188. // GetPendingDataLength
  189. //
  190. // @Description: 获取连接中未发出数据的长度
  191. // @param ConnID 连接 ID
  192. func (t *Server[T]) GetPendingDataLength(ConnID uintptr) (Pending int) {
  193. if !t.isValid() {
  194. return
  195. }
  196. HP_Server_GetPendingDataLength.Call(t.hServer, ConnID, &Pending)
  197. return
  198. }
  199. // GetConnectionCount
  200. //
  201. // @Description: 获取客户端连接数
  202. func (t *Server[T]) GetConnectionCount() int {
  203. if !t.isValid() {
  204. return 0
  205. }
  206. return HP_Server_GetConnectionCount.CallInt(t.hServer)
  207. }
  208. // GetAllConnectionIDs
  209. //
  210. // @Description: 获取所有连接的 HP_CONNID
  211. // @return IDs
  212. func (t *Server[T]) GetAllConnectionIDs() (IDs []uintptr) {
  213. if !t.isValid() {
  214. return
  215. }
  216. var j_count uintptr
  217. HP_Server_GetAllConnectionIDs.Call(t.hServer, 0, &j_count)
  218. if j_count == 0 {
  219. return
  220. }
  221. IDs = make([]uintptr, j_count)
  222. HP_Server_GetAllConnectionIDs.Call(t.hServer, IDs, &j_count)
  223. return
  224. }
  225. // GetConnectPeriod
  226. //
  227. // @Description: 获取某个客户端连接时长(毫秒)
  228. // @param ConnID 连接 ID
  229. func (t *Server[T]) GetConnectPeriod(ConnID uintptr) (Pending int) {
  230. if !t.isValid() {
  231. return
  232. }
  233. HP_Server_GetConnectPeriod.Call(t.hServer, ConnID, &Pending)
  234. return
  235. }
  236. // GetSilencePeriod
  237. //
  238. // @Description: 获取某个连接静默时间(毫秒)
  239. // @param ConnID 连接 ID
  240. func (t *Server[T]) GetSilencePeriod(ConnID uintptr) (Period int) {
  241. if !t.isValid() {
  242. return
  243. }
  244. HP_Server_GetSilencePeriod.Call(t.hServer, ConnID, &Period)
  245. return
  246. }
  247. // GetListenAddress
  248. //
  249. // @Description: 获取监听 Socket 的地址信息
  250. func (t *Server[T]) GetListenAddress() (address string, port int) {
  251. if !t.isValid() {
  252. return
  253. }
  254. j_address_len := 128
  255. j_address := make([]byte, 64)
  256. if !HP_Server_GetListenAddress.CallBool(t.hServer, j_address, &j_address_len, &port) {
  257. return
  258. }
  259. j_address_len -= 1 // 有结束符 {0}
  260. j_unicode_len := j_address_len * 2
  261. j_unicode := make([]byte, j_unicode_len)
  262. yu_sys.MultiByteToWideChar.Call(936, 0, j_address, j_address_len, j_unicode, j_unicode_len)
  263. j_utf8_size := j_unicode_len * 2
  264. j_utf8 := make([]byte, j_utf8_size)
  265. address = string(j_utf8[:yu_sys.WideCharToMultiByte.CallInt(65001, 0, j_unicode, j_address_len, j_utf8, j_utf8_size, 0, 0)])
  266. return
  267. }
  268. // GetLocalAddress
  269. //
  270. // @Description: 获取某个连接的本地地址信息
  271. // @param ConnID 连接 ID
  272. func (t *Server[T]) GetLocalAddress(ConnID uintptr) (address string, port int) {
  273. if !t.isValid() {
  274. return
  275. }
  276. j_address_len := 128
  277. j_address := make([]byte, 64)
  278. if !HP_Server_GetLocalAddress.CallBool(t.hServer, ConnID, j_address, &j_address_len, &port) {
  279. return
  280. }
  281. j_address_len -= 1 // 有结束符 {0}
  282. j_unicode_len := j_address_len * 2
  283. j_unicode := make([]byte, j_unicode_len)
  284. yu_sys.MultiByteToWideChar.Call(936, 0, j_address, j_address_len, j_unicode, j_unicode_len)
  285. j_utf8_size := j_unicode_len * 2
  286. j_utf8 := make([]byte, j_utf8_size)
  287. address = string(j_utf8[:yu_sys.WideCharToMultiByte.CallInt(65001, 0, j_unicode, j_address_len, j_utf8, j_utf8_size, 0, 0)])
  288. return
  289. }
  290. // GetRemoteAddress
  291. //
  292. // @Description: 获取某个连接的远程地址信息
  293. // @param ConnID 连接 ID
  294. func (t *Server[T]) GetRemoteAddress(ConnID uintptr) (address string, port int) {
  295. if !t.isValid() {
  296. return
  297. }
  298. j_address_len := 128
  299. j_address := make([]byte, 64)
  300. if !HP_Server_GetRemoteAddress.CallBool(t.hServer, ConnID, j_address, &j_address_len, &port) {
  301. return
  302. }
  303. j_address_len -= 1 // 有结束符 {0}
  304. j_unicode_len := j_address_len * 2
  305. j_unicode := make([]byte, j_unicode_len)
  306. yu_sys.MultiByteToWideChar.Call(936, 0, j_address, j_address_len, j_unicode, j_unicode_len)
  307. j_utf8_size := j_unicode_len * 2
  308. j_utf8 := make([]byte, j_utf8_size)
  309. address = string(j_utf8[:yu_sys.WideCharToMultiByte.CallInt(65001, 0, j_unicode, j_address_len, j_utf8, j_utf8_size, 0, 0)])
  310. return
  311. }
  312. // SetSendPolicy
  313. //
  314. // @Description: 设置数据发送策略
  315. // @param SendPolicy SP_ 开头常量
  316. func (t *Server[T]) SetSendPolicy(SendPolicy SP) *Server[T] {
  317. if !t.isValid() {
  318. return t
  319. }
  320. HP_Server_SetSendPolicy.Call(t.hServer, uintptr(SendPolicy))
  321. return t
  322. }
  323. // SetOnSendSyncPolicy
  324. //
  325. // @Description: 设置 OnSend 事件同步策略(默认:OSSP_NONE,不同步)
  326. // @param SyncPolicy OSSP_ 开头常量
  327. func (t *Server[T]) SetOnSendSyncPolicy(SyncPolicy OSSP) *Server[T] {
  328. if !t.isValid() {
  329. return t
  330. }
  331. HP_Server_SetOnSendSyncPolicy.Call(t.hServer, uintptr(SyncPolicy))
  332. return t
  333. }
  334. // SetFreeSocketObjLockTime
  335. //
  336. // @Description: 设置 Socket 缓存对象锁定时间(毫秒,在锁定期间该 Socket 缓存对象不能被获取使用)
  337. func (t *Server[T]) SetFreeSocketObjLockTime(FreeSocketObjLockTime int) *Server[T] {
  338. if !t.isValid() {
  339. return t
  340. }
  341. HP_Server_SetFreeSocketObjLockTime.Call(t.hServer, FreeSocketObjLockTime)
  342. return t
  343. }
  344. // SetFreeSocketObjPool
  345. //
  346. // @Description: 设置 Socket 缓存池大小(通常设置为平均并发连接数量的 1/3 - 1/2)
  347. func (t *Server[T]) SetFreeSocketObjPool(FreeSocketObjPool int) *Server[T] {
  348. if !t.isValid() {
  349. return t
  350. }
  351. HP_Server_SetFreeSocketObjPool.Call(t.hServer, FreeSocketObjPool)
  352. return t
  353. }
  354. // SetFreeBufferObjPool
  355. //
  356. // @Description: 设置内存块缓存池大小(通常设置为 Socket 缓存池大小的 2 - 3 倍)
  357. func (t *Server[T]) SetFreeBufferObjPool(FreeBufferObjPool int) *Server[T] {
  358. if !t.isValid() {
  359. return t
  360. }
  361. HP_Server_SetFreeBufferObjPool.Call(t.hServer, FreeBufferObjPool)
  362. return t
  363. }
  364. // SetFreeSocketObjHold
  365. //
  366. // @Description: 设置 Socket 缓存池回收阀值(通常设置为 Socket 缓存池大小的 3 倍)
  367. func (t *Server[T]) SetFreeSocketObjHold(FreeSocketObjHold int) *Server[T] {
  368. if !t.isValid() {
  369. return t
  370. }
  371. HP_Server_SetFreeSocketObjHold.Call(t.hServer, FreeSocketObjHold)
  372. return t
  373. }
  374. // SetFreeBufferObjHold
  375. //
  376. // @Description: 设置内存块缓存池回收阀值(通常设置为内存块缓存池大小的 3 倍)
  377. func (t *Server[T]) SetFreeBufferObjHold(FreeBufferObjHold int) *Server[T] {
  378. if !t.isValid() {
  379. return t
  380. }
  381. HP_Server_SetFreeBufferObjHold.Call(t.hServer, FreeBufferObjHold)
  382. return t
  383. }
  384. // SetMaxConnectionCount
  385. //
  386. // @Description: 设置最大连接数(组件会根据设置值预分配内存,因此需要根据实际情况设置,不宜过大)
  387. func (t *Server[T]) SetMaxConnectionCount(MaxConnectionCount int) *Server[T] {
  388. if !t.isValid() {
  389. return t
  390. }
  391. HP_Server_SetMaxConnectionCount.Call(t.hServer, MaxConnectionCount)
  392. return t
  393. }
  394. // SetWorkerThreadCount
  395. //
  396. // @Description: 设置工作线程数量(通常设置为 2 * CPU + 2)
  397. func (t *Server[T]) SetWorkerThreadCount(WorkerThreadCount int) *Server[T] {
  398. if !t.isValid() {
  399. return t
  400. }
  401. HP_Server_SetWorkerThreadCount.Call(t.hServer, WorkerThreadCount)
  402. return t
  403. }
  404. // SetMarkSilence
  405. //
  406. // @Description: 设置是否标记静默时间(设置为 TRUE 时 DisconnectSilenceConnections() 和 GetSilencePeriod() 才有效,默认:TRUE)
  407. func (t *Server[T]) SetMarkSilence(MarkSilence bool) *Server[T] {
  408. if !t.isValid() {
  409. return t
  410. }
  411. HP_Server_SetMarkSilence.Call(t.hServer, MarkSilence)
  412. return t
  413. }
  414. // GetSendPolicy
  415. //
  416. // @Description: 获取数据发送策略
  417. func (t *Server[T]) GetSendPolicy() SP {
  418. if !t.isValid() {
  419. return 0
  420. }
  421. return SP(HP_Server_GetSendPolicy.CallUintptr(t.hServer))
  422. }
  423. // GetOnSendSyncPolicy
  424. //
  425. // @Description: 获取 OnSend 事件同步策略,返回 OSSP_ 开头常量
  426. func (t *Server[T]) GetOnSendSyncPolicy() OSSP {
  427. if !t.isValid() {
  428. return 0
  429. }
  430. return OSSP(HP_Server_GetOnSendSyncPolicy.CallUintptr(t.hServer))
  431. }
  432. // GetFreeSocketObjLockTime
  433. //
  434. // @Description: 获取 Socket 缓存对象锁定时间
  435. func (t *Server[T]) GetFreeSocketObjLockTime() int {
  436. if !t.isValid() {
  437. return 0
  438. }
  439. return HP_Server_GetFreeSocketObjLockTime.CallInt(t.hServer)
  440. }
  441. // GetFreeSocketObjPool
  442. //
  443. // @Description: 获取 Socket 缓存池大小
  444. func (t *Server[T]) GetFreeSocketObjPool() int {
  445. if !t.isValid() {
  446. return 0
  447. }
  448. return HP_Server_GetFreeSocketObjPool.CallInt(t.hServer)
  449. }
  450. // GetFreeBufferObjPool
  451. //
  452. // @Description: 获取内存块缓存池大小
  453. func (t *Server[T]) GetFreeBufferObjPool() int {
  454. if !t.isValid() {
  455. return 0
  456. }
  457. return HP_Server_GetFreeBufferObjPool.CallInt(t.hServer)
  458. }
  459. // GetFreeSocketObjHold
  460. //
  461. // @Description: 获取 Socket 缓存池回收阀值
  462. func (t *Server[T]) GetFreeSocketObjHold() int {
  463. if !t.isValid() {
  464. return 0
  465. }
  466. return HP_Server_GetFreeSocketObjHold.CallInt(t.hServer)
  467. }
  468. // GetFreeBufferObjHold
  469. //
  470. // @Description: 获取内存块缓存池回收阀值
  471. func (t *Server[T]) GetFreeBufferObjHold() int {
  472. if !t.isValid() {
  473. return 0
  474. }
  475. return HP_Server_GetFreeBufferObjHold.CallInt(t.hServer)
  476. }
  477. // GetMaxConnectionCount
  478. //
  479. // @Description: 获取最大连接数
  480. func (t *Server[T]) GetMaxConnectionCount() int {
  481. if !t.isValid() {
  482. return 0
  483. }
  484. return HP_Server_GetMaxConnectionCount.CallInt(t.hServer)
  485. }
  486. // GetWorkerThreadCount
  487. //
  488. // @Description: 获取工作线程数量
  489. func (t *Server[T]) GetWorkerThreadCount() int {
  490. if !t.isValid() {
  491. return 0
  492. }
  493. return HP_Server_GetWorkerThreadCount.CallInt(t.hServer)
  494. }
  495. // IsMarkSilence
  496. //
  497. // @Description: 检测是否标记静默时间
  498. func (t *Server[T]) IsMarkSilence() bool {
  499. if !t.isValid() {
  500. return false
  501. }
  502. return HP_Server_IsMarkSilence.CallBool(t.hServer)
  503. }
  504. // SetupSSLContext
  505. //
  506. // @Description: 初始化通信组件SSL环境参数 必须在 SSL 通信组件启动前完成初始化,否则启动失败
  507. // @param VerifyMode SSL_VM_ 开头常量, SSL验证模式
  508. // @param PemCertFile 证书文件
  509. // @param PemKeyFile 私钥文件
  510. // @param KeyPasswod 私钥密码(没有密码则为空)
  511. // @param CAPemCertFileOrPath CA 证书文件或目录(单向验证或客户端可选)
  512. func (t *Server[T]) SetupSSLContext(VerifyMode SSL_VM, PemCertFile, PemKeyFile, KeyPasswod, CAPemCertFileOrPath string) bool {
  513. if !t.isValid() {
  514. return false
  515. }
  516. return HP_SSLServer_SetupSSLContext.CallBool(t.hServer, uintptr(VerifyMode),
  517. yu_sys.S{yu_sys.Gbk, PemCertFile}, yu_sys.S{yu_sys.Gbk, PemKeyFile},
  518. yu_sys.S{yu_sys.Gbk, KeyPasswod}, yu_sys.S{yu_sys.Gbk, CAPemCertFileOrPath},
  519. 0, // fnServerNameCallback SNI 回调函数指针(可选)int (__HP_CALL *Fn_SNI_ServerNameCallback)(LPCTSTR lpszServerName, PVOID pContext)
  520. )
  521. }
  522. // SetupSSLContextByMemory 名称:
  523. //
  524. // @Description: 初始化通信组件SSL环境参数 必须在SSL通信组件启动前完成初始化,否则启动失败
  525. // @param VerifyMode SSL_VM_ 开头常量, SSL验证模式
  526. // @param PemCert 证书内容
  527. // @param PemKey 私钥内容
  528. // @param KeyPasswod 私钥密码(没有密码则为空)
  529. // @param CAPemCert CA 证书内容(单向验证可选)
  530. func (t *Server[T]) SetupSSLContextByMemory(VerifyMode SSL_VM, PemCert, PemKey, KeyPasswod, CAPemCert string) bool {
  531. if !t.isValid() {
  532. return false
  533. }
  534. return HP_SSLServer_SetupSSLContextByMemory.CallBool(t.hServer, uintptr(VerifyMode),
  535. yu_sys.S{yu_sys.Gbk, PemCert}, yu_sys.S{yu_sys.Gbk, PemKey},
  536. yu_sys.S{yu_sys.Gbk, KeyPasswod}, yu_sys.S{yu_sys.Gbk, CAPemCert},
  537. 0, // fnServerNameCallback SNI 回调函数指针(可选)int (__HP_CALL *Fn_SNI_ServerNameCallback)(LPCTSTR lpszServerName, PVOID pContext)
  538. )
  539. }
  540. // AddSSLContext 名称:增加 SNI 主机证书
  541. //
  542. // @Description: 增加 SNI 主机证书 SSL服务端在 SetupSSLContext() 成功后可以调用本方法增加多个 SNI 主机证书,正数-成功,并返回 SNI 主机证书对应的索引,该索引用于在 SNI 回调函数中定位 SNI 主机,负数-失败
  543. // @param VerifyMode SSL_VM_ 开头常量, SSL验证模式
  544. // @param PemCertFile 证书文件
  545. // @param PemKeyFile 私钥文件
  546. // @param KeyPasswod 私钥密码(没有密码则为空)
  547. // @param CAPemCertFileOrPath CA 证书文件或目录(单向验证或客户端可选)
  548. func (t *Server[T]) AddSSLContext(VerifyMode SSL_VM, PemCertFile, PemKeyFile, KeyPasswod, CAPemCertFileOrPath string) int {
  549. if !t.isValid() {
  550. return -1
  551. }
  552. return HP_SSLServer_AddSSLContext.CallInt(t.hServer, uintptr(VerifyMode),
  553. yu_sys.S{yu_sys.Gbk, PemCertFile}, yu_sys.S{yu_sys.Gbk, PemKeyFile},
  554. yu_sys.S{yu_sys.Gbk, KeyPasswod}, yu_sys.S{yu_sys.Gbk, CAPemCertFileOrPath},
  555. )
  556. }
  557. // AddSSLContextByMemory 名称:增加 SNI 主机证书
  558. //
  559. // @Description: 增加 SNI 主机证书 SSL服务端在 SetupSSLContext() 成功后可以调用本方法增加多个 SNI 主机证书,正数-成功,并返回 SNI 主机证书对应的索引,该索引用于在 SNI 回调函数中定位 SNI 主机,负数-失败
  560. // @param VerifyMode SSL_VM_ 开头常量, SSL验证模式
  561. // @param PemCert 证书文件
  562. // @param PemKey 私钥文件
  563. // @param KeyPasswod 私钥密码(没有密码则为空)
  564. // @param CAPemCert CA 证书内容(单向验证可选)
  565. func (t *Server[T]) AddSSLContextByMemory(VerifyMode SSL_VM, PemCert, PemKey, KeyPasswod, CAPemCert string) int {
  566. if !t.isValid() {
  567. return -1
  568. }
  569. return HP_SSLServer_AddSSLContextByMemory.CallInt(t.hServer, uintptr(VerifyMode),
  570. yu_sys.S{yu_sys.Gbk, PemCert}, yu_sys.S{yu_sys.Gbk, PemKey},
  571. yu_sys.S{yu_sys.Gbk, KeyPasswod}, yu_sys.S{yu_sys.Gbk, CAPemCert},
  572. )
  573. }
  574. // BindSSLServerName 名称:绑定 SNI 主机域名
  575. //
  576. // @Description: 绑定 SNI 主机域名 SSL服务端在 AddSSLContext() 成功后可以调用本方法绑定主机域名到 SNI 主机证书
  577. // @param DomainName 主机域名
  578. // @param ContextIndex SNI 主机证书对应的索引
  579. func (t *Server[T]) BindSSLServerName(DomainName string, ContextIndex uintptr) bool {
  580. if !t.isValid() {
  581. return false
  582. }
  583. return HP_SSLServer_BindSSLServerName.CallBool(t.hServer, yu_sys.S{yu_sys.Gbk, DomainName}, ContextIndex)
  584. }
  585. // StartSSLHandShake
  586. //
  587. // @Description: 启动 SSL 握手,当通信组件设置为非自动握手时,需要调用本方法启动 SSL 握手
  588. // @param ConnID 连接 ID
  589. func (t *Server[T]) StartSSLHandShake(ConnID uintptr) bool {
  590. if !t.isValid() {
  591. return false
  592. }
  593. return HP_SSLServer_StartSSLHandShake.CallBool(t.hServer, ConnID)
  594. }
  595. // SetSSLAutoHandShake
  596. //
  597. // @Description: 设置通信组件握手方式(默认:真,自动握手)
  598. func (t *Server[T]) SetSSLAutoHandShake(AutoHandShake bool) *Server[T] {
  599. if !t.isValid() {
  600. return t
  601. }
  602. HP_SSLServer_SetSSLAutoHandShake.Call(t.hServer, AutoHandShake)
  603. return t
  604. }
  605. // IsSSLAutoHandShake
  606. //
  607. // @Description: 获取通信组件握手方式
  608. func (t *Server[T]) IsSSLAutoHandShake() bool {
  609. if !t.isValid() {
  610. return false
  611. }
  612. return HP_SSLServer_IsSSLAutoHandShake.CallBool(t.hServer)
  613. }
  614. // SetSSLCipherList
  615. //
  616. // @Description: 设置 SSL加密算法列表
  617. func (t *Server[T]) SetSSLCipherList(CipherList string) *Server[T] {
  618. if !t.isValid() {
  619. return t
  620. }
  621. HP_SSLServer_SetSSLCipherList.Call(t.hServer, yu_sys.S{yu_sys.Gbk, CipherList})
  622. return t
  623. }
  624. // GetSSLCipherList
  625. //
  626. // @Description: 获取 SSL加密算法列表
  627. func (t *Server[T]) GetSSLCipherList() string {
  628. if !t.isValid() {
  629. return ""
  630. }
  631. return HP_SSLServer_GetSSLCipherList.CallGbkToUtf8(t.hServer)
  632. }
  633. // GetSSLSessionInfo 名称:
  634. //
  635. // @Description: 获取指定类型的 SSLSession 信息(输出类型参考:SSL_SSI_)
  636. // @param info SSL_SSI_ 开头常量
  637. func (t *Server[T]) GetSSLSessionInfo(info SSL_SSI) (Info uintptr) {
  638. if !t.isValid() {
  639. return
  640. }
  641. HP_SSLServer_GetSSLSessionInfo.Call(t.hServer, uintptr(info), &Info)
  642. return
  643. }
  644. // IsPauseReceive
  645. //
  646. // @Description: 获取连接的数据接收状态
  647. // @param ConnID 连接 ID
  648. func (t *Server[T]) IsPauseReceive(ConnID uintptr) (Paused bool) {
  649. if !t.isValid() {
  650. return
  651. }
  652. HP_Server_IsPauseReceive.Call(t.hServer, ConnID, &Paused)
  653. return
  654. }
  655. // IsConnected
  656. //
  657. // @Description: 检测是否有效连接
  658. // @param ConnID 连接 ID
  659. func (t *Server[T]) IsConnected(ConnID uintptr) bool {
  660. if !t.isValid() {
  661. return false
  662. }
  663. return HP_Server_IsConnected.CallBool(t.hServer, ConnID)
  664. }
  665. // PauseReceive
  666. //
  667. // @Description: 暂停/恢复某个连接的数据接收工作
  668. // @param ConnID 连接 ID
  669. func (t *Server[T]) PauseReceive(ConnID uintptr, Paused bool) bool {
  670. if !t.isValid() {
  671. return false
  672. }
  673. return HP_Server_PauseReceive.CallBool(t.hServer, ConnID, Paused)
  674. }
  675. // CleanupSSLContext
  676. //
  677. // @Description: 清理通信组件 SSL运行环境,回收 SSL相关内存,无,/当要重新设置通信组件 SSL环境参数时,需要先调用本方法清理原先的环境参数
  678. func (t *Server[T]) CleanupSSLContext() *Server[T] {
  679. if !t.isValid() {
  680. return t
  681. }
  682. HP_SSLServer_CleanupSSLContext.Call(t.hServer)
  683. return t
  684. }
  685. // OnPrepareListen
  686. //
  687. // @Description: 【可选】绑定准备监听事件
  688. // @param call->return HR_ 开头常量
  689. func (t *Server[T]) OnPrepareListen(call func(t *T, Sender, Listen uintptr) HR) *Server[T] {
  690. if !t.isValid() {
  691. return t
  692. }
  693. if call == nil {
  694. HP_Set_FN_Server_OnPrepareListen.Call(t.hListener, 0)
  695. } else {
  696. t.onPrepareListen = call
  697. HP_Set_FN_Server_OnPrepareListen.Call(t.hListener, server_callback_OnPrepareListen_ptr)
  698. }
  699. return t
  700. }
  701. // OnAccept
  702. //
  703. // @Description: 【可选】绑定接受事件
  704. // @param call->return HR_ 开头常量
  705. func (t *Server[T]) OnAccept(call func(t *T, Sender, ConnID, Client uintptr) HR) *Server[T] {
  706. if !t.isValid() {
  707. return t
  708. }
  709. if call == nil {
  710. HP_Set_FN_Server_OnAccept.Call(t.hListener, 0)
  711. } else {
  712. t.onAccept = call
  713. HP_Set_FN_Server_OnAccept.Call(t.hListener, server_callback_OnAccept_ptr)
  714. }
  715. return t
  716. }
  717. // OnHandShake
  718. //
  719. // @Description: 【可选】绑定握手事件
  720. // @param call->return HR_ 开头常量
  721. func (t *Server[T]) OnHandShake(call func(t *T, Sender, ConnID uintptr) HR) *Server[T] {
  722. if !t.isValid() {
  723. return t
  724. }
  725. if call == nil {
  726. HP_Set_FN_Server_OnHandShake.Call(t.hListener, 0)
  727. } else {
  728. t.onHandShake = call
  729. HP_Set_FN_Server_OnHandShake.Call(t.hListener, server_callback_OnHandShake_ptr)
  730. }
  731. return t
  732. }
  733. // OnSend
  734. //
  735. // @Description: 【可选】绑定发送事件
  736. // @param call->return HR_ 开头常量
  737. func (t *Server[T]) OnSend(call func(t *T, Sender, ConnID, Data uintptr, Length uintptr) HR) *Server[T] {
  738. if !t.isValid() {
  739. return t
  740. }
  741. if call == nil {
  742. HP_Set_FN_Server_OnSend.Call(t.hListener, 0)
  743. } else {
  744. t.onSend = call
  745. HP_Set_FN_Server_OnSend.Call(t.hListener, server_callback_OnSend_ptr)
  746. }
  747. return t
  748. }
  749. // OnReceive
  750. //
  751. // @Description: 【必选】绑定数据接收事件
  752. // @param call->return HR_ 开头常量
  753. func (t *Server[T]) OnReceive(call func(t *T, Sender, ConnID, Data uintptr, Length uintptr) HR) *Server[T] {
  754. if !t.isValid() {
  755. return t
  756. }
  757. if call == nil {
  758. HP_Set_FN_Server_OnReceive.Call(t.hListener, 0)
  759. } else {
  760. t.onReceive = call
  761. HP_Set_FN_Server_OnReceive.Call(t.hListener, server_callback_OnReceive_ptr)
  762. }
  763. return t
  764. }
  765. // OnClose
  766. //
  767. // @Description: 【必选】绑定断开事件
  768. // @param call->Operation 通过该参数标识是哪种操作导致的错误 SO_ 开头常量
  769. // @param call->return HR_ 开头常量
  770. func (t *Server[T]) OnClose(call func(t *T, Sender, ConnID uintptr, Operation SO, ErrorCode int) HR) *Server[T] {
  771. if !t.isValid() {
  772. return t
  773. }
  774. if call == nil {
  775. HP_Set_FN_Server_OnClose.Call(t.hListener, 0)
  776. } else {
  777. t.onClose = call
  778. HP_Set_FN_Server_OnClose.Call(t.hListener, server_callback_OnClose_ptr)
  779. }
  780. return t
  781. }
  782. // OnShutdown
  783. //
  784. // @Description: 【可选】绑定关闭事件
  785. // @param call->return HR_ 开头常量
  786. func (t *Server[T]) OnShutdown(call func(t *T, Sender uintptr) HR) *Server[T] {
  787. if !t.isValid() {
  788. return t
  789. }
  790. if call == nil {
  791. HP_Set_FN_Server_OnShutdown.Call(t.hListener, 0)
  792. } else {
  793. t.onShutdown = call
  794. HP_Set_FN_Server_OnShutdown.Call(t.hListener, server_callback_OnShutdown_ptr)
  795. }
  796. return t
  797. }
  798. // OnDefault
  799. //
  800. // @Description: 【可选】绑定所有【必选】事件
  801. func (t *Server[T]) OnDefault() *Server[T] {
  802. if !t.isValid() {
  803. return t
  804. }
  805. if t.onReceive == nil {
  806. t.OnReceive(func(t *T, Sender, ConnID, Data uintptr, Length uintptr) HR {
  807. return HR_OK
  808. })
  809. }
  810. if t.onClose == nil {
  811. t.OnClose(func(t *T, Sender, ConnID uintptr, Operation SO, ErrorCode int) HR {
  812. return HR_OK
  813. })
  814. }
  815. return t
  816. }