SocketInterface.h 129 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107
  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. #pragma once
  24. #include <winsock2.h>
  25. #include "HPTypeDef.h"
  26. /*****************************************************************************************************************************************************/
  27. /***************************************************************** TCP/UDP Interfaces ****************************************************************/
  28. /*****************************************************************************************************************************************************/
  29. /************************************************************************
  30. 名称:双接口模版类
  31. 描述:定义双接口转换方法
  32. ************************************************************************/
  33. #if FALSE
  34. #define __DUAL_VPTR_GAP__ sizeof(PVOID)
  35. class __IFakeDualInterface__
  36. {
  37. public:
  38. virtual ~__IFakeDualInterface__() {}
  39. };
  40. template<class F, class S> class DualInterface : public F, private __IFakeDualInterface__, public S
  41. #else
  42. #define __DUAL_VPTR_GAP__ 0
  43. template<class F, class S> class DualInterface : public F, public S
  44. #endif
  45. {
  46. public:
  47. /* this 转换为 F* */
  48. inline static F* ToF(DualInterface* pThis)
  49. {
  50. return (F*)(pThis);
  51. }
  52. /* F* 转换为 this */
  53. inline static DualInterface* FromF(F* pF)
  54. {
  55. return (DualInterface*)(pF);
  56. }
  57. /* this 转换为 S* */
  58. inline static S* ToS(DualInterface* pThis)
  59. {
  60. return (S*)(F2S(ToF(pThis)));
  61. }
  62. /* S* 转换为 this */
  63. inline static DualInterface* FromS(S* pS)
  64. {
  65. return FromF(S2F(pS));
  66. }
  67. /* S* 转换为 F* */
  68. inline static F* S2F(S* pS)
  69. {
  70. return (F*)((char*)pS - (sizeof(F) + __DUAL_VPTR_GAP__));
  71. }
  72. /* F* 转换为 S* */
  73. inline static S* F2S(F* pF)
  74. {
  75. return (S*)((char*)pF + (sizeof(F) + __DUAL_VPTR_GAP__));
  76. }
  77. public:
  78. virtual ~DualInterface() {}
  79. };
  80. /************************************************************************
  81. 名称:复合 Socket 组件接口
  82. 描述:定义复合 Socket 组件的所有操作方法和属性访问方法,复合 Socket 组件同时管理多个 Socket 连接
  83. ************************************************************************/
  84. class IComplexSocket
  85. {
  86. public:
  87. /***********************************************************************/
  88. /***************************** 组件操作方法 *****************************/
  89. /*
  90. * 名称:关闭通信组件
  91. * 描述:关闭通信组件,关闭完成后断开所有连接并释放所有资源
  92. *
  93. * 参数:
  94. * 返回值: TRUE -- 成功
  95. * FALSE -- 失败,可通过 GetLastError() 获取错误代码
  96. */
  97. virtual BOOL Stop () = 0;
  98. /*
  99. * 名称:发送数据
  100. * 描述:向指定连接发送数据
  101. *
  102. * 参数: dwConnID -- 连接 ID
  103. * pBuffer -- 发送缓冲区
  104. * iLength -- 发送缓冲区长度
  105. * iOffset -- 发送缓冲区指针偏移量
  106. * 返回值: TRUE -- 成功
  107. * FALSE -- 失败,可通过 SYS_GetLastError() 获取错误代码
  108. */
  109. virtual BOOL Send (CONNID dwConnID, const BYTE* pBuffer, int iLength, int iOffset = 0) = 0;
  110. /*
  111. * 名称:发送多组数据
  112. * 描述:向指定连接发送多组数据
  113. * TCP - 顺序发送所有数据包
  114. * UDP - 把所有数据包组合成一个数据包发送(数据包的总长度不能大于设置的 UDP 包最大长度)
  115. *
  116. * 参数: dwConnID -- 连接 ID
  117. * pBuffers -- 发送缓冲区数组
  118. * iCount -- 发送缓冲区数目
  119. * 返回值: TRUE -- 成功
  120. * FALSE -- 失败,可通过 SYS_GetLastError() 获取错误代码
  121. */
  122. virtual BOOL SendPackets(CONNID dwConnID, const WSABUF pBuffers[], int iCount) = 0;
  123. /*
  124. * 名称:暂停/恢复接收
  125. * 描述:暂停/恢复某个连接的数据接收工作
  126. *
  127. * 参数: dwConnID -- 连接 ID
  128. * bPause -- TRUE - 暂停, FALSE - 恢复
  129. * 返回值: TRUE -- 成功
  130. * FALSE -- 失败
  131. */
  132. virtual BOOL PauseReceive(CONNID dwConnID, BOOL bPause = TRUE) = 0;
  133. /*
  134. * 名称:断开连接
  135. * 描述:断开某个连接
  136. *
  137. * 参数: dwConnID -- 连接 ID
  138. * bForce -- 是否强制断开连接
  139. * 返回值: TRUE -- 成功
  140. * FALSE -- 失败
  141. */
  142. virtual BOOL Disconnect(CONNID dwConnID, BOOL bForce = TRUE) = 0;
  143. /*
  144. * 名称:断开超时连接
  145. * 描述:断开超过指定时长的连接
  146. *
  147. * 参数: dwPeriod -- 时长(毫秒)
  148. * bForce -- 是否强制断开连接
  149. * 返回值: TRUE -- 成功
  150. * FALSE -- 失败
  151. */
  152. virtual BOOL DisconnectLongConnections(DWORD dwPeriod, BOOL bForce = TRUE) = 0;
  153. /*
  154. * 名称:断开静默连接
  155. * 描述:断开超过指定时长的静默连接
  156. *
  157. * 参数: dwPeriod -- 时长(毫秒)
  158. * bForce -- 是否强制断开连接
  159. * 返回值: TRUE -- 成功
  160. * FALSE -- 失败
  161. */
  162. virtual BOOL DisconnectSilenceConnections(DWORD dwPeriod, BOOL bForce = TRUE) = 0;
  163. /*
  164. * 名称:等待
  165. * 描述:等待通信组件停止运行
  166. *
  167. * 参数: dwMilliseconds -- 超时时间(毫秒,默认:-1,永不超时)
  168. * 返回值: TRUE -- 成功
  169. * FALSE -- 失败,可通过 SYS_GetLastError() 获取错误代码
  170. */
  171. virtual BOOL Wait(DWORD dwMilliseconds = INFINITE) = 0;
  172. public:
  173. /***********************************************************************/
  174. /***************************** 属性访问方法 *****************************/
  175. /*
  176. * 名称:设置连接的附加数据
  177. * 描述:是否为连接绑定附加数据或者绑定什么样的数据,均由应用程序自身决定
  178. *
  179. * 参数: dwConnID -- 连接 ID
  180. * pv -- 数据
  181. * 返回值: TRUE -- 成功
  182. * FALSE -- 失败(无效的连接 ID)
  183. */
  184. virtual BOOL SetConnectionExtra (CONNID dwConnID, PVOID pExtra) = 0;
  185. /*
  186. * 名称:获取连接的附加数据
  187. * 描述:是否为连接绑定附加数据或者绑定什么样的数据,均由应用程序自身决定
  188. *
  189. * 参数: dwConnID -- 连接 ID
  190. * ppv -- 数据指针
  191. * 返回值: TRUE -- 成功
  192. * FALSE -- 失败(无效的连接 ID)
  193. */
  194. virtual BOOL GetConnectionExtra (CONNID dwConnID, PVOID* ppExtra) = 0;
  195. /* 检测是否为安全连接(SSL/HTTPS) */
  196. virtual BOOL IsSecure () = 0;
  197. /* 检查通信组件是否已启动 */
  198. virtual BOOL HasStarted () = 0;
  199. /* 查看通信组件当前状态 */
  200. virtual EnServiceState GetState () = 0;
  201. /* 获取连接数 */
  202. virtual DWORD GetConnectionCount () = 0;
  203. /* 获取所有连接的 CONNID */
  204. virtual BOOL GetAllConnectionIDs (CONNID pIDs[], DWORD& dwCount) = 0;
  205. /* 获取某个连接时长(毫秒) */
  206. virtual BOOL GetConnectPeriod (CONNID dwConnID, DWORD& dwPeriod) = 0;
  207. /* 获取某个连接静默时间(毫秒) */
  208. virtual BOOL GetSilencePeriod (CONNID dwConnID, DWORD& dwPeriod) = 0;
  209. /* 获取某个连接的本地地址信息 */
  210. virtual BOOL GetLocalAddress (CONNID dwConnID, TCHAR lpszAddress[], int& iAddressLen, USHORT& usPort) = 0;
  211. /* 获取某个连接的远程地址信息 */
  212. virtual BOOL GetRemoteAddress (CONNID dwConnID, TCHAR lpszAddress[], int& iAddressLen, USHORT& usPort) = 0;
  213. /* 获取最近一次失败操作的错误代码 */
  214. virtual EnSocketError GetLastError () = 0;
  215. /* 获取最近一次失败操作的错误描述 */
  216. virtual LPCTSTR GetLastErrorDesc () = 0;
  217. /* 获取连接中未发出数据的长度 */
  218. virtual BOOL GetPendingDataLength (CONNID dwConnID, int& iPending) = 0;
  219. /* 获取连接的数据接收状态 */
  220. virtual BOOL IsPauseReceive (CONNID dwConnID, BOOL& bPaused) = 0;
  221. /* 检测是否有效连接 */
  222. virtual BOOL IsConnected (CONNID dwConnID) = 0;
  223. /* 设置地址重用选项 */
  224. virtual void SetReuseAddressPolicy(EnReuseAddressPolicy enReusePolicy) = 0;
  225. /* 设置数据发送策略 */
  226. virtual void SetSendPolicy (EnSendPolicy enSendPolicy) = 0;
  227. /* 设置 OnSend 事件同步策略(默认:OSSP_NONE,不同步) */
  228. virtual void SetOnSendSyncPolicy (EnOnSendSyncPolicy enSyncPolicy) = 0;
  229. /* 设置最大连接数(组件会根据设置值预分配内存,因此需要根据实际情况设置,不宜过大)*/
  230. virtual void SetMaxConnectionCount (DWORD dwMaxConnectionCount) = 0;
  231. /* 设置 Socket 缓存对象锁定时间(毫秒,在锁定期间该 Socket 缓存对象不能被获取使用) */
  232. virtual void SetFreeSocketObjLockTime (DWORD dwFreeSocketObjLockTime) = 0;
  233. /* 设置 Socket 缓存池大小(通常设置为平均并发连接数的 1/3 - 1/2) */
  234. virtual void SetFreeSocketObjPool (DWORD dwFreeSocketObjPool) = 0;
  235. /* 设置内存块缓存池大小(通常设置为 Socket 缓存池大小的 2 - 3 倍) */
  236. virtual void SetFreeBufferObjPool (DWORD dwFreeBufferObjPool) = 0;
  237. /* 设置 Socket 缓存池回收阀值(通常设置为 Socket 缓存池大小的 3 倍) */
  238. virtual void SetFreeSocketObjHold (DWORD dwFreeSocketObjHold) = 0;
  239. /* 设置内存块缓存池回收阀值 */
  240. virtual void SetFreeBufferObjHold (DWORD dwFreeBufferObjHold) = 0;
  241. /* 设置工作线程数量(通常设置为 2 * CPU + 2) */
  242. virtual void SetWorkerThreadCount (DWORD dwWorkerThreadCount) = 0;
  243. /* 设置是否标记静默时间(设置为 TRUE 时 DisconnectSilenceConnections() 和 GetSilencePeriod() 才有效,默认:TRUE) */
  244. virtual void SetMarkSilence (BOOL bMarkSilence) = 0;
  245. /* 获取地址重用选项 */
  246. virtual EnReuseAddressPolicy GetReuseAddressPolicy () = 0;
  247. /* 获取数据发送策略 */
  248. virtual EnSendPolicy GetSendPolicy () = 0;
  249. /* 获取 OnSend 事件同步策略 */
  250. virtual EnOnSendSyncPolicy GetOnSendSyncPolicy () = 0;
  251. /* 获取最大连接数 */
  252. virtual DWORD GetMaxConnectionCount () = 0;
  253. /* 获取 Socket 缓存对象锁定时间 */
  254. virtual DWORD GetFreeSocketObjLockTime () = 0;
  255. /* 获取 Socket 缓存池大小 */
  256. virtual DWORD GetFreeSocketObjPool () = 0;
  257. /* 获取内存块缓存池大小 */
  258. virtual DWORD GetFreeBufferObjPool () = 0;
  259. /* 获取 Socket 缓存池回收阀值 */
  260. virtual DWORD GetFreeSocketObjHold () = 0;
  261. /* 获取内存块缓存池回收阀值 */
  262. virtual DWORD GetFreeBufferObjHold () = 0;
  263. /* 获取工作线程数量 */
  264. virtual DWORD GetWorkerThreadCount () = 0;
  265. /* 检测是否标记静默时间 */
  266. virtual BOOL IsMarkSilence () = 0;
  267. public:
  268. virtual ~IComplexSocket() {}
  269. };
  270. /************************************************************************
  271. 名称:通信服务端组件接口
  272. 描述:定义通信服务端组件的所有操作方法和属性访问方法
  273. ************************************************************************/
  274. class IServer : public IComplexSocket
  275. {
  276. public:
  277. /***********************************************************************/
  278. /***************************** 组件操作方法 *****************************/
  279. /*
  280. * 名称:启动通信组件
  281. * 描述:启动服务端通信组件,启动完成后可开始接收客户端连接并收发数据
  282. *
  283. * 参数: lpszBindAddress -- 监听地址
  284. * usPort -- 监听端口
  285. * 返回值: TRUE -- 成功
  286. * FALSE -- 失败,可通过 GetLastError() 获取错误代码
  287. */
  288. virtual BOOL Start (LPCTSTR lpszBindAddress, USHORT usPort) = 0;
  289. public:
  290. /***********************************************************************/
  291. /***************************** 属性访问方法 *****************************/
  292. /* 获取监听 Socket 的地址信息 */
  293. virtual BOOL GetListenAddress(TCHAR lpszAddress[], int& iAddressLen, USHORT& usPort) = 0;
  294. };
  295. /************************************************************************
  296. 名称:TCP 通信服务端组件接口
  297. 描述:定义 TCP 通信服务端组件的所有操作方法和属性访问方法
  298. ************************************************************************/
  299. class ITcpServer : public IServer
  300. {
  301. public:
  302. /***********************************************************************/
  303. /***************************** 组件操作方法 *****************************/
  304. /*
  305. * 名称:发送小文件
  306. * 描述:向指定连接发送 4096 KB 以下的小文件
  307. *
  308. * 参数: dwConnID -- 连接 ID
  309. * lpszFileName -- 文件路径
  310. * pHead -- 头部附加数据
  311. * pTail -- 尾部附加数据
  312. * 返回值: TRUE -- 成功
  313. * FALSE -- 失败,可通过 SYS_GetLastError() 获取错误代码
  314. */
  315. virtual BOOL SendSmallFile(CONNID dwConnID, LPCTSTR lpszFileName, const LPWSABUF pHead = nullptr, const LPWSABUF pTail = nullptr) = 0;
  316. #ifdef _SSL_SUPPORT
  317. /*
  318. * 名称:初始化通信组件 SSL 环境参数
  319. * 描述:SSL 环境参数必须在 SSL 通信组件启动前完成初始化,否则启动失败
  320. *
  321. * 参数: iVerifyMode -- SSL 验证模式(参考 EnSSLVerifyMode)
  322. * lpszPemCertFile -- 证书文件
  323. * lpszPemKeyFile -- 私钥文件
  324. * lpszKeyPassword -- 私钥密码(没有密码则为空)
  325. * lpszCAPemCertFileOrPath -- CA 证书文件或目录(单向验证或客户端可选)
  326. * fnServerNameCallback -- SNI 回调函数指针(可选,如果为 nullptr 则使用 SNI 默认回调函数)
  327. *
  328. * 返回值: TRUE -- 成功
  329. * FALSE -- 失败,可通过 SYS_GetLastError() 获取失败原因
  330. */
  331. virtual BOOL SetupSSLContext(int iVerifyMode = SSL_VM_NONE, LPCTSTR lpszPemCertFile = nullptr, LPCTSTR lpszPemKeyFile = nullptr, LPCTSTR lpszKeyPassword = nullptr, LPCTSTR lpszCAPemCertFileOrPath = nullptr, Fn_SNI_ServerNameCallback fnServerNameCallback = nullptr) = 0;
  332. /*
  333. * 名称:初始化通信组件 SSL 环境参数(通过内存加载证书)
  334. * 描述:SSL 环境参数必须在 SSL 通信组件启动前完成初始化,否则启动失败
  335. *
  336. * 参数: iVerifyMode -- SSL 验证模式(参考 EnSSLVerifyMode)
  337. * lpszPemCert -- 证书内容
  338. * lpszPemKey -- 私钥内容
  339. * lpszKeyPassword -- 私钥密码(没有密码则为空)
  340. * lpszCAPemCert -- CA 证书内容(单向验证或客户端可选)
  341. * fnServerNameCallback -- SNI 回调函数指针(可选,如果为 nullptr 则使用 SNI 默认回调函数)
  342. *
  343. * 返回值: TRUE -- 成功
  344. * FALSE -- 失败,可通过 SYS_GetLastError() 获取失败原因
  345. */
  346. virtual BOOL SetupSSLContextByMemory(int iVerifyMode = SSL_VM_NONE, LPCSTR lpszPemCert = nullptr, LPCSTR lpszPemKey = nullptr, LPCSTR lpszKeyPassword = nullptr, LPCSTR lpszCAPemCert = nullptr, Fn_SNI_ServerNameCallback fnServerNameCallback = nullptr) = 0;
  347. /*
  348. * 名称:增加 SNI 主机证书
  349. * 描述:SSL 服务端在 SetupSSLContext() 成功后可以调用本方法增加多个 SNI 主机证书
  350. *
  351. * 参数: iVerifyMode -- SSL 验证模式(参考 EnSSLVerifyMode)
  352. * lpszPemCertFile -- 证书文件
  353. * lpszPemKeyFile -- 私钥文件
  354. * lpszKeyPassword -- 私钥密码(没有密码则为空)
  355. * lpszCAPemCertFileOrPath -- CA 证书文件或目录(单向验证可选)
  356. *
  357. * 返回值: 正数 -- 成功,并返回 SNI 主机证书对应的索引,该索引用于在 SNI 回调函数中定位 SNI 主机
  358. * 负数 -- 失败,可通过 SYS_GetLastError() 获取失败原因
  359. */
  360. virtual int AddSSLContext(int iVerifyMode = SSL_VM_NONE, LPCTSTR lpszPemCertFile = nullptr, LPCTSTR lpszPemKeyFile = nullptr, LPCTSTR lpszKeyPassword = nullptr, LPCTSTR lpszCAPemCertFileOrPath = nullptr) = 0;
  361. /*
  362. * 名称:增加 SNI 主机证书(通过内存加载证书)
  363. * 描述:SSL 服务端在 SetupSSLContext() 成功后可以调用本方法增加多个 SNI 主机证书
  364. *
  365. * 参数: iVerifyMode -- SSL 验证模式(参考 EnSSLVerifyMode)
  366. * lpszPemCert -- 证书内容
  367. * lpszPemKey -- 私钥内容
  368. * lpszKeyPassword -- 私钥密码(没有密码则为空)
  369. * lpszCAPemCert -- CA 证书内容(单向验证可选)
  370. *
  371. * 返回值: 正数 -- 成功,并返回 SNI 主机证书对应的索引,该索引用于在 SNI 回调函数中定位 SNI 主机
  372. * 负数 -- 失败,可通过 SYS_GetLastError() 获取失败原因
  373. */
  374. virtual int AddSSLContextByMemory(int iVerifyMode = SSL_VM_NONE, LPCSTR lpszPemCert = nullptr, LPCSTR lpszPemKey = nullptr, LPCSTR lpszKeyPassword = nullptr, LPCSTR lpszCAPemCert = nullptr) = 0;
  375. /*
  376. * 名称:绑定 SNI 主机域名
  377. * 描述:SSL 服务端在 AddSSLContext() 成功后可以调用本方法绑定主机域名到 SNI 主机证书
  378. *
  379. * 参数: lpszServerName -- 主机域名
  380. * iContextIndex -- SNI 主机证书对应的索引
  381. *
  382. * 返回值: TRUE -- 成功
  383. * FALSE -- 失败,可通过 SYS_GetLastError() 获取失败原因
  384. */
  385. virtual BOOL BindSSLServerName(LPCTSTR lpszServerName, int iContextIndex) = 0;
  386. /*
  387. * 名称:清理通信组件 SSL 运行环境
  388. * 描述:清理通信组件 SSL 运行环境,回收 SSL 相关内存
  389. * 1、通信组件析构时会自动调用本方法
  390. * 2、当要重新设置通信组件 SSL 环境参数时,需要先调用本方法清理原先的环境参数
  391. *
  392. * 参数: 无
  393. *
  394. * 返回值:无
  395. */
  396. virtual void CleanupSSLContext() = 0;
  397. /*
  398. * 名称:启动 SSL 握手
  399. * 描述:当通信组件设置为非自动握手时,需要调用本方法启动 SSL 握手
  400. *
  401. * 返回值: TRUE -- 成功
  402. * FALSE -- 失败,可通过 SYS_GetLastError() 获取失败原因
  403. */
  404. virtual BOOL StartSSLHandShake(CONNID dwConnID) = 0;
  405. #endif
  406. public:
  407. /***********************************************************************/
  408. /***************************** 属性访问方法 *****************************/
  409. /* 设置 Accept 预投递数量(根据负载调整设置,Accept 预投递数量越大则支持的并发连接请求越多) */
  410. virtual void SetAcceptSocketCount (DWORD dwAcceptSocketCount) = 0;
  411. /* 设置通信数据缓冲区大小(根据平均通信数据包大小调整设置,通常设置为 1024 的倍数) */
  412. virtual void SetSocketBufferSize (DWORD dwSocketBufferSize) = 0;
  413. /* 设置监听 Socket 的等候队列大小(根据并发连接数量调整设置) */
  414. virtual void SetSocketListenQueue (DWORD dwSocketListenQueue) = 0;
  415. /* 设置正常心跳包间隔(毫秒,0 则不发送心跳包,默认:60 * 1000) */
  416. virtual void SetKeepAliveTime (DWORD dwKeepAliveTime) = 0;
  417. /* 设置异常心跳包间隔(毫秒,0 不发送心跳包,,默认:20 * 1000,如果超过若干次 [默认:WinXP 5 次, Win7 10 次] 检测不到心跳确认包则认为已断线) */
  418. virtual void SetKeepAliveInterval (DWORD dwKeepAliveInterval) = 0;
  419. /* 设置是否开启 nodelay 模式(默认:FALSE,不开启) */
  420. virtual void SetNoDelay (BOOL bNoDelay) = 0;
  421. /* 获取 Accept 预投递数量 */
  422. virtual DWORD GetAcceptSocketCount () = 0;
  423. /* 获取通信数据缓冲区大小 */
  424. virtual DWORD GetSocketBufferSize () = 0;
  425. /* 获取监听 Socket 的等候队列大小 */
  426. virtual DWORD GetSocketListenQueue () = 0;
  427. /* 获取正常心跳包间隔 */
  428. virtual DWORD GetKeepAliveTime () = 0;
  429. /* 获取异常心跳包间隔 */
  430. virtual DWORD GetKeepAliveInterval () = 0;
  431. /* 检查是否开启 nodelay 模式 */
  432. virtual BOOL IsNoDelay () = 0;
  433. #ifdef _SSL_SUPPORT
  434. /* 设置通信组件握手方式(默认:TRUE,自动握手) */
  435. virtual void SetSSLAutoHandShake(BOOL bAutoHandShake) = 0;
  436. /* 获取通信组件握手方式 */
  437. virtual BOOL IsSSLAutoHandShake() = 0;
  438. /* 设置 SSL 加密算法列表 */
  439. virtual void SetSSLCipherList(LPCTSTR lpszCipherList) = 0;
  440. /* 获取 SSL 加密算法列表 */
  441. virtual LPCTSTR GetSSLCipherList() = 0;
  442. /*
  443. * 名称:获取 SSL Session 信息
  444. * 描述:获取指定类型的 SSL Session 信息(输出类型参考:EnSSLSessionInfo)
  445. *
  446. * 返回值: TRUE -- 成功
  447. * FALSE -- 失败,可通过 SYS_GetLastError() 获取失败原因
  448. */
  449. virtual BOOL GetSSLSessionInfo(CONNID dwConnID, EnSSLSessionInfo enInfo, LPVOID* lppInfo) = 0;
  450. #endif
  451. };
  452. #ifdef _UDP_SUPPORT
  453. /************************************************************************
  454. 名称:UDP 通信服务端组件接口
  455. 描述:定义 UDP 通信服务端组件的所有操作方法和属性访问方法
  456. ************************************************************************/
  457. class IUdpServer : public IServer
  458. {
  459. public:
  460. /***********************************************************************/
  461. /***************************** 组件操作方法 *****************************/
  462. public:
  463. /***********************************************************************/
  464. /***************************** 属性访问方法 *****************************/
  465. /* 设置数据报文最大长度(建议在局域网环境下不超过 1432 字节,在广域网环境下不超过 548 字节) */
  466. virtual void SetMaxDatagramSize (DWORD dwMaxDatagramSize) = 0;
  467. /* 获取数据报文最大长度 */
  468. virtual DWORD GetMaxDatagramSize () = 0;
  469. /* 设置 Receive 预投递数量(根据负载调整设置,Receive 预投递数量越大则丢包概率越小) */
  470. virtual void SetPostReceiveCount (DWORD dwPostReceiveCount) = 0;
  471. /* 获取 Receive 预投递数量 */
  472. virtual DWORD GetPostReceiveCount () = 0;
  473. /* 设置监测包尝试次数(0 则不发送监测跳包,如果超过最大尝试次数则认为已断线) */
  474. virtual void SetDetectAttempts (DWORD dwDetectAttempts) = 0;
  475. /* 设置监测包发送间隔(毫秒,0 不发送监测包) */
  476. virtual void SetDetectInterval (DWORD dwDetectInterval) = 0;
  477. /* 获取心跳检查次数 */
  478. virtual DWORD GetDetectAttempts () = 0;
  479. /* 获取心跳检查间隔 */
  480. virtual DWORD GetDetectInterval () = 0;
  481. };
  482. /************************************************************************
  483. 名称:Server/Agent ARQ 模型组件接口
  484. 描述:定义 Server/Agent 组件的 ARQ 模型组件的所有操作方法
  485. ************************************************************************/
  486. class IArqSocket
  487. {
  488. public:
  489. /***********************************************************************/
  490. /***************************** 组件操作方法 *****************************/
  491. public:
  492. /***********************************************************************/
  493. /***************************** 属性访问方法 *****************************/
  494. /* 设置是否开启 nodelay 模式(默认:FALSE,不开启) */
  495. virtual void SetNoDelay (BOOL bNoDelay) = 0;
  496. /* 设置是否关闭拥塞控制(默认:FALSE,不关闭) */
  497. virtual void SetTurnoffCongestCtrl (BOOL bTurnOff) = 0;
  498. /* 设置数据刷新间隔(毫秒,默认:60) */
  499. virtual void SetFlushInterval (DWORD dwFlushInterval) = 0;
  500. /* 设置快速重传 ACK 跨越次数(默认:0,关闭快速重传) */
  501. virtual void SetResendByAcks (DWORD dwResendByAcks) = 0;
  502. /* 设置发送窗口大小(数据包数量,默认:128) */
  503. virtual void SetSendWndSize (DWORD dwSendWndSize) = 0;
  504. /* 设置接收窗口大小(数据包数量,默认:512) */
  505. virtual void SetRecvWndSize (DWORD dwRecvWndSize) = 0;
  506. /* 设置最小重传超时时间(毫秒,默认:30) */
  507. virtual void SetMinRto (DWORD dwMinRto) = 0;
  508. /* 设置快速握手次数限制(默认:5,如果为 0 则不限制) */
  509. virtual void SetFastLimit (DWORD dwFastLimit) = 0;
  510. /* 设置最大传输单元(默认:0,与 SetMaxDatagramSize() 一致) */
  511. virtual void SetMaxTransUnit (DWORD dwMaxTransUnit) = 0;
  512. /* 设置最大数据包大小(默认:4096) */
  513. virtual void SetMaxMessageSize (DWORD dwMaxMessageSize) = 0;
  514. /* 设置握手超时时间(毫秒,默认:5000) */
  515. virtual void SetHandShakeTimeout (DWORD dwHandShakeTimeout) = 0;
  516. /* 检测是否开启 nodelay 模式 */
  517. virtual BOOL IsNoDelay () = 0;
  518. /* 检测是否关闭拥塞控制 */
  519. virtual BOOL IsTurnoffCongestCtrl () = 0;
  520. /* 获取数据刷新间隔 */
  521. virtual DWORD GetFlushInterval () = 0;
  522. /* 获取快速重传 ACK 跨越次数 */
  523. virtual DWORD GetResendByAcks () = 0;
  524. /* 获取发送窗口大小 */
  525. virtual DWORD GetSendWndSize () = 0;
  526. /* 获取接收窗口大小 */
  527. virtual DWORD GetRecvWndSize () = 0;
  528. /* 获取最小重传超时时间 */
  529. virtual DWORD GetMinRto () = 0;
  530. /* 获取快速握手次数限制 */
  531. virtual DWORD GetFastLimit () = 0;
  532. /* 获取最大传输单元 */
  533. virtual DWORD GetMaxTransUnit () = 0;
  534. /* 获取最大数据包大小 */
  535. virtual DWORD GetMaxMessageSize () = 0;
  536. /* 获取握手超时时间 */
  537. virtual DWORD GetHandShakeTimeout () = 0;
  538. /* 获取等待发送包数量 */
  539. virtual BOOL GetWaitingSendMessageCount (CONNID dwConnID, int& iCount) = 0;
  540. public:
  541. virtual ~IArqSocket() {}
  542. };
  543. /************************************************************************
  544. 名称:UDP ARQ 通信服务端组件接口
  545. 描述:继承了 ARQ 和 Server 接口
  546. ************************************************************************/
  547. typedef DualInterface<IArqSocket, IUdpServer> IUdpArqServer;
  548. #endif
  549. /************************************************************************
  550. 名称:通信代理组件接口
  551. 描述:定义通信代理组件的所有操作方法和属性访问方法,代理组件本质是一个同时连接多个服务器的客户端组件
  552. ************************************************************************/
  553. class IAgent : public IComplexSocket
  554. {
  555. public:
  556. /***********************************************************************/
  557. /***************************** 组件操作方法 *****************************/
  558. /*
  559. * 名称:启动通信组件
  560. * 描述:启动通信代理组件,启动完成后可开始连接远程服务器
  561. *
  562. * 参数: lpszBindAddress -- 绑定地址(默认:nullptr,绑定任意地址)
  563. * bAsyncConnect -- 是否采用异步 Connect
  564. * 返回值: TRUE -- 成功
  565. * FALSE -- 失败,可通过 GetLastError() 获取错误代码
  566. */
  567. virtual BOOL Start (LPCTSTR lpszBindAddress = nullptr, BOOL bAsyncConnect = TRUE) = 0;
  568. /*
  569. * 名称:连接服务器
  570. * 描述:连接服务器,连接成功后 IAgentListener 会接收到 OnConnect() / OnHandShake() 事件
  571. *
  572. * 参数: lpszRemoteAddress -- 服务端地址
  573. * usPort -- 服务端端口
  574. * pdwConnID -- 连接 ID(默认:nullptr,不获取连接 ID)
  575. * pExtra -- 连接附加数据(默认:nullptr)
  576. * usLocalPort -- 本地端口(默认:0)
  577. * lpszLocalAddress -- 本地地址(默认:nullptr,使用 Start() 方法中绑定的地址)
  578. * 返回值: TRUE -- 成功
  579. * FALSE -- 失败,可通过 SYS_GetLastError() 获取错误代码
  580. */
  581. virtual BOOL Connect(LPCTSTR lpszRemoteAddress, USHORT usPort, CONNID* pdwConnID = nullptr, PVOID pExtra = nullptr, USHORT usLocalPort = 0, LPCTSTR lpszLocalAddress = nullptr) = 0;
  582. public:
  583. /***********************************************************************/
  584. /***************************** 属性访问方法 *****************************/
  585. /* 获取某个连接的远程主机信息 */
  586. virtual BOOL GetRemoteHost (CONNID dwConnID, TCHAR lpszHost[], int& iHostLen, USHORT& usPort) = 0;
  587. };
  588. /************************************************************************
  589. 名称:TCP 通信代理组件接口
  590. 描述:定义 TCP 通信代理组件的所有操作方法和属性访问方法
  591. ************************************************************************/
  592. class ITcpAgent : public IAgent
  593. {
  594. public:
  595. /***********************************************************************/
  596. /***************************** 组件操作方法 *****************************/
  597. /*
  598. * 名称:发送小文件
  599. * 描述:向指定连接发送 4096 KB 以下的小文件
  600. *
  601. * 参数: dwConnID -- 连接 ID
  602. * lpszFileName -- 文件路径
  603. * pHead -- 头部附加数据
  604. * pTail -- 尾部附加数据
  605. * 返回值: TRUE -- 成功
  606. * FALSE -- 失败,可通过 SYS_GetLastError() 获取错误代码
  607. */
  608. virtual BOOL SendSmallFile(CONNID dwConnID, LPCTSTR lpszFileName, const LPWSABUF pHead = nullptr, const LPWSABUF pTail = nullptr) = 0;
  609. #ifdef _SSL_SUPPORT
  610. /*
  611. * 名称:初始化通信组件 SSL 环境参数
  612. * 描述:SSL 环境参数必须在 SSL 通信组件启动前完成初始化,否则启动失败
  613. *
  614. * 参数: iVerifyMode -- SSL 验证模式(参考 EnSSLVerifyMode)
  615. * lpszPemCertFile -- 证书文件(客户端可选)
  616. * lpszPemKeyFile -- 私钥文件(客户端可选)
  617. * lpszKeyPassword -- 私钥密码(没有密码则为空)
  618. * lpszCAPemCertFileOrPath -- CA 证书文件或目录(单向验证或客户端可选)
  619. *
  620. * 返回值: TRUE -- 成功
  621. * FALSE -- 失败,可通过 SYS_GetLastError() 获取失败原因
  622. */
  623. virtual BOOL SetupSSLContext(int iVerifyMode = SSL_VM_NONE, LPCTSTR lpszPemCertFile = nullptr, LPCTSTR lpszPemKeyFile = nullptr, LPCTSTR lpszKeyPassword = nullptr, LPCTSTR lpszCAPemCertFileOrPath = nullptr) = 0;
  624. /*
  625. * 名称:初始化通信组件 SSL 环境参数(通过内存加载证书)
  626. * 描述:SSL 环境参数必须在 SSL 通信组件启动前完成初始化,否则启动失败
  627. *
  628. * 参数: iVerifyMode -- SSL 验证模式(参考 EnSSLVerifyMode)
  629. * lpszPemCert -- 证书内容
  630. * lpszPemKey -- 私钥内容
  631. * lpszKeyPassword -- 私钥密码(没有密码则为空)
  632. * lpszCAPemCert -- CA 证书内容(单向验证或客户端可选)
  633. *
  634. * 返回值: TRUE -- 成功
  635. * FALSE -- 失败,可通过 SYS_GetLastError() 获取失败原因
  636. */
  637. virtual BOOL SetupSSLContextByMemory(int iVerifyMode = SSL_VM_NONE, LPCSTR lpszPemCert = nullptr, LPCSTR lpszPemKey = nullptr, LPCSTR lpszKeyPassword = nullptr, LPCSTR lpszCAPemCert = nullptr) = 0;
  638. /*
  639. * 名称:清理通信组件 SSL 运行环境
  640. * 描述:清理通信组件 SSL 运行环境,回收 SSL 相关内存
  641. * 1、通信组件析构时会自动调用本方法
  642. * 2、当要重新设置通信组件 SSL 环境参数时,需要先调用本方法清理原先的环境参数
  643. *
  644. * 参数: 无
  645. *
  646. * 返回值:无
  647. */
  648. virtual void CleanupSSLContext() = 0;
  649. /*
  650. * 名称:启动 SSL 握手
  651. * 描述:当通信组件设置为非自动握手时,需要调用本方法启动 SSL 握手
  652. *
  653. * 返回值: TRUE -- 成功
  654. * FALSE -- 失败,可通过 SYS_GetLastError() 获取失败原因
  655. */
  656. virtual BOOL StartSSLHandShake(CONNID dwConnID) = 0;
  657. #endif
  658. public:
  659. /***********************************************************************/
  660. /***************************** 属性访问方法 *****************************/
  661. /* 设置通信数据缓冲区大小(根据平均通信数据包大小调整设置,通常设置为 1024 的倍数) */
  662. virtual void SetSocketBufferSize (DWORD dwSocketBufferSize) = 0;
  663. /* 设置正常心跳包间隔(毫秒,0 则不发送心跳包,默认:60 * 1000) */
  664. virtual void SetKeepAliveTime (DWORD dwKeepAliveTime) = 0;
  665. /* 设置异常心跳包间隔(毫秒,0 不发送心跳包,,默认:20 * 1000,如果超过若干次 [默认:WinXP 5 次, Win7 10 次] 检测不到心跳确认包则认为已断线) */
  666. virtual void SetKeepAliveInterval (DWORD dwKeepAliveInterval) = 0;
  667. /* 设置是否开启 nodelay 模式(默认:FALSE,不开启) */
  668. virtual void SetNoDelay (BOOL bNoDelay) = 0;
  669. /* 获取通信数据缓冲区大小 */
  670. virtual DWORD GetSocketBufferSize () = 0;
  671. /* 获取正常心跳包间隔 */
  672. virtual DWORD GetKeepAliveTime () = 0;
  673. /* 获取异常心跳包间隔 */
  674. virtual DWORD GetKeepAliveInterval () = 0;
  675. /* 检查是否开启 nodelay 模式 */
  676. virtual BOOL IsNoDelay () = 0;
  677. #ifdef _SSL_SUPPORT
  678. /* 设置通信组件握手方式(默认:TRUE,自动握手) */
  679. virtual void SetSSLAutoHandShake(BOOL bAutoHandShake) = 0;
  680. /* 获取通信组件握手方式 */
  681. virtual BOOL IsSSLAutoHandShake() = 0;
  682. /* 设置 SSL 加密算法列表 */
  683. virtual void SetSSLCipherList(LPCTSTR lpszCipherList) = 0;
  684. /* 获取 SSL 加密算法列表 */
  685. virtual LPCTSTR GetSSLCipherList() = 0;
  686. /*
  687. * 名称:获取 SSL Session 信息
  688. * 描述:获取指定类型的 SSL Session 信息(输出类型参考:EnSSLSessionInfo)
  689. *
  690. * 返回值: TRUE -- 成功
  691. * FALSE -- 失败,可通过 SYS_GetLastError() 获取失败原因
  692. */
  693. virtual BOOL GetSSLSessionInfo(CONNID dwConnID, EnSSLSessionInfo enInfo, LPVOID* lppInfo) = 0;
  694. #endif
  695. };
  696. /************************************************************************
  697. 名称:通信客户端组件接口
  698. 描述:定义通信客户端组件的所有操作方法和属性访问方法
  699. ************************************************************************/
  700. class IClient
  701. {
  702. public:
  703. /***********************************************************************/
  704. /***************************** 组件操作方法 *****************************/
  705. /*
  706. * 名称:启动通信组件
  707. * 描述:启动客户端通信组件并连接服务端,启动完成后可开始收发数据
  708. *
  709. * 参数: lpszRemoteAddress -- 服务端地址
  710. * usPort -- 服务端端口
  711. * bAsyncConnect -- 是否采用异步 Connect
  712. * lpszBindAddress -- 绑定地址(默认:nullptr,TcpClient/UdpClient -> 不执行绑定操作,UdpCast 绑定 -> 任意地址)
  713. * usLocalPort -- 本地端口(默认:0)
  714. * 返回值: TRUE -- 成功
  715. * FALSE -- 失败,可通过 GetLastError() 获取错误代码
  716. */
  717. virtual BOOL Start (LPCTSTR lpszRemoteAddress, USHORT usPort, BOOL bAsyncConnect = TRUE, LPCTSTR lpszBindAddress = nullptr, USHORT usLocalPort = 0) = 0;
  718. /*
  719. * 名称:关闭通信组件
  720. * 描述:关闭客户端通信组件,关闭完成后断开与服务端的连接并释放所有资源
  721. *
  722. * 参数:
  723. * 返回值: TRUE -- 成功
  724. * FALSE -- 失败,可通过 GetLastError() 获取错误代码
  725. */
  726. virtual BOOL Stop () = 0;
  727. /*
  728. * 名称:发送数据
  729. * 描述:向服务端发送数据
  730. *
  731. * 参数: pBuffer -- 发送缓冲区
  732. * iLength -- 发送缓冲区长度
  733. * iOffset -- 发送缓冲区指针偏移量
  734. * 返回值: TRUE -- 成功
  735. * FALSE -- 失败,可通过 SYS_GetLastError() 获取错误代码
  736. */
  737. virtual BOOL Send (const BYTE* pBuffer, int iLength, int iOffset = 0) = 0;
  738. /*
  739. * 名称:发送多组数据
  740. * 描述:向服务端发送多组数据
  741. * TCP - 顺序发送所有数据包
  742. * UDP - 把所有数据包组合成一个数据包发送(数据包的总长度不能大于设置的 UDP 包最大长度)
  743. *
  744. * 参数: pBuffers -- 发送缓冲区数组
  745. * iCount -- 发送缓冲区数目
  746. * 返回值: TRUE -- 成功
  747. * FALSE -- 失败,可通过 SYS_GetLastError() 获取错误代码
  748. */
  749. virtual BOOL SendPackets(const WSABUF pBuffers[], int iCount) = 0;
  750. /*
  751. * 名称:暂停/恢复接收
  752. * 描述:暂停/恢复某个连接的数据接收工作
  753. *
  754. * bPause -- TRUE - 暂停, FALSE - 恢复
  755. * 返回值: TRUE -- 成功
  756. * FALSE -- 失败
  757. */
  758. virtual BOOL PauseReceive(BOOL bPause = TRUE) = 0;
  759. /*
  760. * 名称:等待
  761. * 描述:等待通信组件停止运行
  762. *
  763. * 参数: dwMilliseconds -- 超时时间(毫秒,默认:-1,永不超时)
  764. * 返回值: TRUE -- 成功
  765. * FALSE -- 失败,可通过 SYS_GetLastError() 获取错误代码
  766. */
  767. virtual BOOL Wait(DWORD dwMilliseconds = INFINITE) = 0;
  768. public:
  769. /***********************************************************************/
  770. /***************************** 属性访问方法 *****************************/
  771. /* 设置连接的附加数据 */
  772. virtual void SetExtra (PVOID pExtra) = 0;
  773. /* 获取连接的附加数据 */
  774. virtual PVOID GetExtra () = 0;
  775. /* 检测是否为安全连接(SSL/HTTPS) */
  776. virtual BOOL IsSecure () = 0;
  777. /* 检查通信组件是否已启动 */
  778. virtual BOOL HasStarted () = 0;
  779. /* 查看通信组件当前状态 */
  780. virtual EnServiceState GetState () = 0;
  781. /* 获取最近一次失败操作的错误代码 */
  782. virtual EnSocketError GetLastError () = 0;
  783. /* 获取最近一次失败操作的错误描述 */
  784. virtual LPCTSTR GetLastErrorDesc() = 0;
  785. /* 获取该组件对象的连接 ID */
  786. virtual CONNID GetConnectionID () = 0;
  787. /* 获取 Client Socket 的地址信息 */
  788. virtual BOOL GetLocalAddress (TCHAR lpszAddress[], int& iAddressLen, USHORT& usPort) = 0;
  789. /* 获取连接的远程主机信息 */
  790. virtual BOOL GetRemoteHost (TCHAR lpszHost[], int& iHostLen, USHORT& usPort) = 0;
  791. /* 获取连接中未发出数据的长度 */
  792. virtual BOOL GetPendingDataLength (int& iPending) = 0;
  793. /* 获取连接的数据接收状态 */
  794. virtual BOOL IsPauseReceive (BOOL& bPaused) = 0;
  795. /* 检测是否有效连接 */
  796. virtual BOOL IsConnected () = 0;
  797. /* 设置地址重用选项 */
  798. virtual void SetReuseAddressPolicy(EnReuseAddressPolicy enReusePolicy) = 0;
  799. /* 设置内存块缓存池大小 */
  800. virtual void SetFreeBufferPoolSize (DWORD dwFreeBufferPoolSize) = 0;
  801. /* 设置内存块缓存池回收阀值 */
  802. virtual void SetFreeBufferPoolHold (DWORD dwFreeBufferPoolHold) = 0;
  803. /* 获取地址重用选项 */
  804. virtual EnReuseAddressPolicy GetReuseAddressPolicy () = 0;
  805. /* 获取内存块缓存池大小 */
  806. virtual DWORD GetFreeBufferPoolSize () = 0;
  807. /* 获取内存块缓存池回收阀值 */
  808. virtual DWORD GetFreeBufferPoolHold () = 0;
  809. public:
  810. virtual ~IClient() {}
  811. };
  812. /************************************************************************
  813. 名称:TCP 通信客户端组件接口
  814. 描述:定义 TCP 通信客户端组件的所有操作方法和属性访问方法
  815. ************************************************************************/
  816. class ITcpClient : public IClient
  817. {
  818. public:
  819. /***********************************************************************/
  820. /***************************** 组件操作方法 *****************************/
  821. /*
  822. * 名称:发送小文件
  823. * 描述:向服务端发送 4096 KB 以下的小文件
  824. *
  825. * 参数: lpszFileName -- 文件路径
  826. * pHead -- 头部附加数据
  827. * pTail -- 尾部附加数据
  828. * 返回值: TRUE -- 成功
  829. * FALSE -- 失败,可通过 SYS_GetLastError() 获取错误代码
  830. */
  831. virtual BOOL SendSmallFile(LPCTSTR lpszFileName, const LPWSABUF pHead = nullptr, const LPWSABUF pTail = nullptr) = 0;
  832. #ifdef _SSL_SUPPORT
  833. /*
  834. * 名称:初始化通信组件 SSL 环境参数
  835. * 描述:SSL 环境参数必须在 SSL 通信组件启动前完成初始化,否则启动失败
  836. *
  837. * 参数: iVerifyMode -- SSL 验证模式(参考 EnSSLVerifyMode)
  838. * lpszPemCertFile -- 证书文件(客户端可选)
  839. * lpszPemKeyFile -- 私钥文件(客户端可选)
  840. * lpszKeyPassword -- 私钥密码(没有密码则为空)
  841. * lpszCAPemCertFileOrPath -- CA 证书文件或目录(单向验证或客户端可选)
  842. *
  843. * 返回值: TRUE -- 成功
  844. * FALSE -- 失败,可通过 SYS_GetLastError() 获取失败原因
  845. */
  846. virtual BOOL SetupSSLContext(int iVerifyMode = SSL_VM_NONE, LPCTSTR lpszPemCertFile = nullptr, LPCTSTR lpszPemKeyFile = nullptr, LPCTSTR lpszKeyPassword = nullptr, LPCTSTR lpszCAPemCertFileOrPath = nullptr) = 0;
  847. /*
  848. * 名称:初始化通信组件 SSL 环境参数(通过内存加载证书)
  849. * 描述:SSL 环境参数必须在 SSL 通信组件启动前完成初始化,否则启动失败
  850. *
  851. * 参数: iVerifyMode -- SSL 验证模式(参考 EnSSLVerifyMode)
  852. * lpszPemCert -- 证书内容
  853. * lpszPemKey -- 私钥内容
  854. * lpszKeyPassword -- 私钥密码(没有密码则为空)
  855. * lpszCAPemCert -- CA 证书内容(单向验证或客户端可选)
  856. *
  857. * 返回值: TRUE -- 成功
  858. * FALSE -- 失败,可通过 SYS_GetLastError() 获取失败原因
  859. */
  860. virtual BOOL SetupSSLContextByMemory(int iVerifyMode = SSL_VM_NONE, LPCSTR lpszPemCert = nullptr, LPCSTR lpszPemKey = nullptr, LPCSTR lpszKeyPassword = nullptr, LPCSTR lpszCAPemCert = nullptr) = 0;
  861. /*
  862. * 名称:清理通信组件 SSL 运行环境
  863. * 描述:清理通信组件 SSL 运行环境,回收 SSL 相关内存
  864. * 1、通信组件析构时会自动调用本方法
  865. * 2、当要重新设置通信组件 SSL 环境参数时,需要先调用本方法清理原先的环境参数
  866. *
  867. * 参数: 无
  868. *
  869. * 返回值:无
  870. */
  871. virtual void CleanupSSLContext() = 0;
  872. /*
  873. * 名称:启动 SSL 握手
  874. * 描述:当通信组件设置为非自动握手时,需要调用本方法启动 SSL 握手
  875. *
  876. * 返回值: TRUE -- 成功
  877. * FALSE -- 失败,可通过 SYS_GetLastError() 获取失败原因
  878. */
  879. virtual BOOL StartSSLHandShake() = 0;
  880. #endif
  881. public:
  882. /***********************************************************************/
  883. /***************************** 属性访问方法 *****************************/
  884. /* 设置通信数据缓冲区大小(根据平均通信数据包大小调整设置,通常设置为:(N * 1024) - sizeof(TBufferObj)) */
  885. virtual void SetSocketBufferSize (DWORD dwSocketBufferSize) = 0;
  886. /* 设置正常心跳包间隔(毫秒,0 则不发送心跳包,默认:60 * 1000) */
  887. virtual void SetKeepAliveTime (DWORD dwKeepAliveTime) = 0;
  888. /* 设置异常心跳包间隔(毫秒,0 不发送心跳包,,默认:20 * 1000,如果超过若干次 [默认:WinXP 5 次, Win7 10 次] 检测不到心跳确认包则认为已断线) */
  889. virtual void SetKeepAliveInterval (DWORD dwKeepAliveInterval) = 0;
  890. /* 设置是否开启 nodelay 模式(默认:FALSE,不开启) */
  891. virtual void SetNoDelay (BOOL bNoDelay) = 0;
  892. /* 获取通信数据缓冲区大小 */
  893. virtual DWORD GetSocketBufferSize () = 0;
  894. /* 获取正常心跳包间隔 */
  895. virtual DWORD GetKeepAliveTime () = 0;
  896. /* 获取异常心跳包间隔 */
  897. virtual DWORD GetKeepAliveInterval () = 0;
  898. /* 检查是否开启 nodelay 模式 */
  899. virtual BOOL IsNoDelay () = 0;
  900. #ifdef _SSL_SUPPORT
  901. /* 设置通信组件握手方式(默认:TRUE,自动握手) */
  902. virtual void SetSSLAutoHandShake(BOOL bAutoHandShake) = 0;
  903. /* 获取通信组件握手方式 */
  904. virtual BOOL IsSSLAutoHandShake() = 0;
  905. /* 设置 SSL 加密算法列表 */
  906. virtual void SetSSLCipherList(LPCTSTR lpszCipherList) = 0;
  907. /* 获取 SSL 加密算法列表 */
  908. virtual LPCTSTR GetSSLCipherList() = 0;
  909. /*
  910. * 名称:获取 SSL Session 信息
  911. * 描述:获取指定类型的 SSL Session 信息(输出类型参考:EnSSLSessionInfo)
  912. *
  913. * 返回值: TRUE -- 成功
  914. * FALSE -- 失败,可通过 SYS_GetLastError() 获取失败原因
  915. */
  916. virtual BOOL GetSSLSessionInfo(EnSSLSessionInfo enInfo, LPVOID* lppInfo) = 0;
  917. #endif
  918. };
  919. #ifdef _UDP_SUPPORT
  920. /************************************************************************
  921. 名称:UDP 通信客户端组件接口
  922. 描述:定义 UDP 通信客户端组件的所有操作方法和属性访问方法
  923. ************************************************************************/
  924. class IUdpClient : public IClient
  925. {
  926. public:
  927. /***********************************************************************/
  928. /***************************** 组件操作方法 *****************************/
  929. public:
  930. /***********************************************************************/
  931. /***************************** 属性访问方法 *****************************/
  932. /* 设置数据报文最大长度(建议在局域网环境下不超过 1432 字节,在广域网环境下不超过 548 字节) */
  933. virtual void SetMaxDatagramSize (DWORD dwMaxDatagramSize) = 0;
  934. /* 获取数据报文最大长度 */
  935. virtual DWORD GetMaxDatagramSize() = 0;
  936. /* 设置监测包尝试次数(0 则不发送监测跳包,如果超过最大尝试次数则认为已断线) */
  937. virtual void SetDetectAttempts (DWORD dwDetectAttempts) = 0;
  938. /* 设置监测包发送间隔(毫秒,0 不发送监测包) */
  939. virtual void SetDetectInterval (DWORD dwDetectInterval) = 0;
  940. /* 获取心跳检查次数 */
  941. virtual DWORD GetDetectAttempts () = 0;
  942. /* 获取心跳检查间隔 */
  943. virtual DWORD GetDetectInterval () = 0;
  944. };
  945. /************************************************************************
  946. 名称:UDP 传播组件接口
  947. 描述:定义 UDP 传播(组播或广播)组件的所有操作方法和属性访问方法
  948. ************************************************************************/
  949. class IUdpCast : public IClient
  950. {
  951. public:
  952. /***********************************************************************/
  953. /***************************** 组件操作方法 *****************************/
  954. public:
  955. /***********************************************************************/
  956. /***************************** 属性访问方法 *****************************/
  957. /* 设置数据报文最大长度(建议在局域网环境下不超过 1432 字节,在广域网环境下不超过 548 字节) */
  958. virtual void SetMaxDatagramSize (DWORD dwMaxDatagramSize) = 0;
  959. /* 获取数据报文最大长度 */
  960. virtual DWORD GetMaxDatagramSize() = 0;
  961. /* 设置传播模式(组播或广播) */
  962. virtual void SetCastMode (EnCastMode enCastMode) = 0;
  963. /* 获取传播模式 */
  964. virtual EnCastMode GetCastMode () = 0;
  965. /* 设置组播报文的 TTL(0 - 255) */
  966. virtual void SetMultiCastTtl (int iMCTtl) = 0;
  967. /* 获取组播报文的 TTL */
  968. virtual int GetMultiCastTtl () = 0;
  969. /* 设置是否启用组播环路(TRUE or FALSE) */
  970. virtual void SetMultiCastLoop (BOOL bMCLoop) = 0;
  971. /* 检测是否启用组播环路 */
  972. virtual BOOL IsMultiCastLoop () = 0;
  973. /* 获取当前数据报的远程地址信息(通常在 OnReceive 事件中调用) */
  974. virtual BOOL GetRemoteAddress (TCHAR lpszAddress[], int& iAddressLen, USHORT& usPort) = 0;
  975. };
  976. /************************************************************************
  977. 名称:UDP 节点组件接口
  978. 描述:定义 UDP 节点组件的所有操作方法和属性访问方法
  979. ************************************************************************/
  980. class IUdpNode
  981. {
  982. public:
  983. /***********************************************************************/
  984. /***************************** 组件操作方法 *****************************/
  985. /*
  986. * 名称:启动通信组件
  987. * 描述:启动 UDP 节点通信组件,启动完成后可开始收发数据
  988. *
  989. * 参数: lpszBindAddress -- 绑定地址(默认:nullptr,绑定任意地址)
  990. * usPort -- 本地端口(默认:0)
  991. * enCastMode -- 传播模式(默认:CM_UNICAST)
  992. * lpszCastAddress -- 传播地址(默认:nullptr,当 enCaseMode 为 CM_MULTICAST 或 CM_BROADCAST 时有效)
  993. * 返回值: TRUE -- 成功
  994. * FALSE -- 失败,可通过 GetLastError() 获取错误代码
  995. */
  996. virtual BOOL Start(LPCTSTR lpszBindAddress = nullptr, USHORT usPort = 0, EnCastMode enCastMode = CM_UNICAST, LPCTSTR lpszCastAddress = nullptr) = 0;
  997. /*
  998. * 名称:关闭通信组件
  999. * 描述:关闭 UDP 节点通信组件,关闭完成后释放所有资源
  1000. *
  1001. * 参数:
  1002. * 返回值: TRUE -- 成功
  1003. * FALSE -- 失败,可通过 GetLastError() 获取错误代码
  1004. */
  1005. virtual BOOL Stop() = 0;
  1006. /*
  1007. * 名称:发送数据
  1008. * 描述:向指定地址发送数据
  1009. *
  1010. * 参数: lpszRemoteAddress -- 远程地址
  1011. * usRemotePort -- 远程端口
  1012. * pBuffer -- 发送缓冲区
  1013. * iLength -- 发送缓冲区长度
  1014. * iOffset -- 发送缓冲区指针偏移量
  1015. * 返回值: TRUE -- 成功
  1016. * FALSE -- 失败,可通过 SYS_GetLastError() 获取错误代码
  1017. */
  1018. virtual BOOL Send(LPCTSTR lpszRemoteAddress, USHORT usRemotePort, const BYTE* pBuffer, int iLength, int iOffset = 0) = 0;
  1019. /*
  1020. * 名称:发送多组数据
  1021. * 描述:向指定地址发送多组数据,把所有数据包组合成一个数据包发送(数据包的总长度不能大于设置的 UDP 包最大长度)
  1022. *
  1023. * 参数: lpszRemoteAddress -- 远程地址
  1024. * usRemotePort -- 远程端口
  1025. * pBuffers -- 发送缓冲区数组
  1026. * iCount -- 发送缓冲区数目
  1027. * 返回值: TRUE -- 成功
  1028. * FALSE -- 失败,可通过 SYS_GetLastError() 获取错误代码
  1029. */
  1030. virtual BOOL SendPackets(LPCTSTR lpszRemoteAddress, USHORT usRemotePort, const WSABUF pBuffers[], int iCount) = 0;
  1031. /*
  1032. * 名称:发送数据
  1033. * 描述:向传播地址发送数据
  1034. *
  1035. * 参数: pBuffer -- 发送缓冲区
  1036. * iLength -- 发送缓冲区长度
  1037. * iOffset -- 发送缓冲区指针偏移量
  1038. * 返回值: TRUE -- 成功
  1039. * FALSE -- 失败,可通过 SYS_GetLastError() 获取错误代码
  1040. */
  1041. virtual BOOL SendCast(const BYTE* pBuffer, int iLength, int iOffset = 0) = 0;
  1042. /*
  1043. * 名称:发送多组数据
  1044. * 描述:向传播地址发送多组数据,把所有数据包组合成一个数据包发送(数据包的总长度不能大于设置的 UDP 包最大长度)
  1045. *
  1046. * 参数: pBuffers -- 发送缓冲区数组
  1047. * iCount -- 发送缓冲区数目
  1048. * 返回值: TRUE -- 成功
  1049. * FALSE -- 失败,可通过 SYS_GetLastError() 获取错误代码
  1050. */
  1051. virtual BOOL SendCastPackets(const WSABUF pBuffers[], int iCount) = 0;
  1052. /*
  1053. * 名称:等待
  1054. * 描述:等待通信组件停止运行
  1055. *
  1056. * 参数: dwMilliseconds -- 超时时间(毫秒,默认:-1,永不超时)
  1057. * 返回值: TRUE -- 成功
  1058. * FALSE -- 失败,可通过 SYS_GetLastError() 获取错误代码
  1059. */
  1060. virtual BOOL Wait(DWORD dwMilliseconds = INFINITE) = 0;
  1061. public:
  1062. /***********************************************************************/
  1063. /***************************** 属性访问方法 *****************************/
  1064. /* 设置附加数据 */
  1065. virtual void SetExtra (PVOID pExtra) = 0;
  1066. /* 获取附加数据 */
  1067. virtual PVOID GetExtra () = 0;
  1068. /* 检查通信组件是否已启动 */
  1069. virtual BOOL HasStarted () = 0;
  1070. /* 查看通信组件当前状态 */
  1071. virtual EnServiceState GetState () = 0;
  1072. /* 获取最近一次失败操作的错误代码 */
  1073. virtual EnSocketError GetLastError () = 0;
  1074. /* 获取最近一次失败操作的错误描述 */
  1075. virtual LPCTSTR GetLastErrorDesc () = 0;
  1076. /* 获取本节点地址 */
  1077. virtual BOOL GetLocalAddress (TCHAR lpszAddress[], int& iAddressLen, USHORT& usPort) = 0;
  1078. /* 获取本节点传播地址 */
  1079. virtual BOOL GetCastAddress (TCHAR lpszAddress[], int& iAddressLen, USHORT& usPort) = 0;
  1080. /* 获取传播模式 */
  1081. virtual EnCastMode GetCastMode () = 0;
  1082. /* 获取未发出数据的长度 */
  1083. virtual BOOL GetPendingDataLength (int& iPending) = 0;
  1084. /* 设置数据报文最大长度(建议在局域网环境下不超过 1432 字节,在广域网环境下不超过 548 字节) */
  1085. virtual void SetMaxDatagramSize (DWORD dwMaxDatagramSize) = 0;
  1086. /* 获取数据报文最大长度 */
  1087. virtual DWORD GetMaxDatagramSize() = 0;
  1088. /* 设置组播报文的 TTL(0 - 255) */
  1089. virtual void SetMultiCastTtl (int iMCTtl) = 0;
  1090. /* 获取组播报文的 TTL */
  1091. virtual int GetMultiCastTtl () = 0;
  1092. /* 设置是否启用组播环路(TRUE or FALSE) */
  1093. virtual void SetMultiCastLoop (BOOL bMCLoop) = 0;
  1094. /* 检测是否启用组播环路 */
  1095. virtual BOOL IsMultiCastLoop () = 0;
  1096. /* 设置地址重用选项 */
  1097. virtual void SetReuseAddressPolicy(EnReuseAddressPolicy enReusePolicy) = 0;
  1098. /* 设置工作线程数量(通常设置为 2 * CPU + 2) */
  1099. virtual void SetWorkerThreadCount (DWORD dwWorkerThreadCount) = 0;
  1100. /* 设置 Receive 预投递数量(根据负载调整设置,Receive 预投递数量越大则丢包概率越小) */
  1101. virtual void SetPostReceiveCount (DWORD dwPostReceiveCount) = 0;
  1102. /* 设置内存块缓存池大小 */
  1103. virtual void SetFreeBufferPoolSize (DWORD dwFreeBufferPoolSize) = 0;
  1104. /* 设置内存块缓存池回收阀值 */
  1105. virtual void SetFreeBufferPoolHold (DWORD dwFreeBufferPoolHold) = 0;
  1106. /* 获取地址重用选项 */
  1107. virtual EnReuseAddressPolicy GetReuseAddressPolicy() = 0;
  1108. /* 获取工作线程数量 */
  1109. virtual DWORD GetWorkerThreadCount () = 0;
  1110. /* 获取 Receive 预投递数量 */
  1111. virtual DWORD GetPostReceiveCount () = 0;
  1112. /* 获取内存块缓存池大小 */
  1113. virtual DWORD GetFreeBufferPoolSize () = 0;
  1114. /* 获取内存块缓存池回收阀值 */
  1115. virtual DWORD GetFreeBufferPoolHold () = 0;
  1116. public:
  1117. virtual ~IUdpNode() {}
  1118. };
  1119. /************************************************************************
  1120. 名称:Client ARQ 模型组件接口
  1121. 描述:定义 Client 组件的 ARQ 模型组件的所有操作方法
  1122. ************************************************************************/
  1123. class IArqClient
  1124. {
  1125. public:
  1126. /***********************************************************************/
  1127. /***************************** 组件操作方法 *****************************/
  1128. public:
  1129. /***********************************************************************/
  1130. /***************************** 属性访问方法 *****************************/
  1131. /* 设置是否开启 nodelay 模式(默认:FALSE,不开启) */
  1132. virtual void SetNoDelay (BOOL bNoDelay) = 0;
  1133. /* 设置是否关闭拥塞控制(默认:FALSE,不关闭) */
  1134. virtual void SetTurnoffCongestCtrl (BOOL bTurnOff) = 0;
  1135. /* 设置数据刷新间隔(毫秒,默认:60) */
  1136. virtual void SetFlushInterval (DWORD dwFlushInterval) = 0;
  1137. /* 设置快速重传 ACK 跨越次数(默认:0,关闭快速重传) */
  1138. virtual void SetResendByAcks (DWORD dwResendByAcks) = 0;
  1139. /* 设置发送窗口大小(数据包数量,默认:128) */
  1140. virtual void SetSendWndSize (DWORD dwSendWndSize) = 0;
  1141. /* 设置接收窗口大小(数据包数量,默认:512) */
  1142. virtual void SetRecvWndSize (DWORD dwRecvWndSize) = 0;
  1143. /* 设置最小重传超时时间(毫秒,默认:30) */
  1144. virtual void SetMinRto (DWORD dwMinRto) = 0;
  1145. /* 设置快速握手次数限制(默认:5,如果为 0 则不限制) */
  1146. virtual void SetFastLimit (DWORD dwFastLimit) = 0;
  1147. /* 设置最大传输单元(默认:0,与 SetMaxDatagramSize() 一致) */
  1148. virtual void SetMaxTransUnit (DWORD dwMaxTransUnit) = 0;
  1149. /* 设置最大数据包大小(默认:4096) */
  1150. virtual void SetMaxMessageSize (DWORD dwMaxMessageSize) = 0;
  1151. /* 设置握手超时时间(毫秒,默认:5000) */
  1152. virtual void SetHandShakeTimeout (DWORD dwHandShakeTimeout) = 0;
  1153. /* 检测是否开启 nodelay 模式 */
  1154. virtual BOOL IsNoDelay () = 0;
  1155. /* 检测是否关闭拥塞控制 */
  1156. virtual BOOL IsTurnoffCongestCtrl () = 0;
  1157. /* 获取数据刷新间隔 */
  1158. virtual DWORD GetFlushInterval () = 0;
  1159. /* 获取快速重传 ACK 跨越次数 */
  1160. virtual DWORD GetResendByAcks () = 0;
  1161. /* 获取发送窗口大小 */
  1162. virtual DWORD GetSendWndSize () = 0;
  1163. /* 获取接收窗口大小 */
  1164. virtual DWORD GetRecvWndSize () = 0;
  1165. /* 获取最小重传超时时间 */
  1166. virtual DWORD GetMinRto () = 0;
  1167. /* 获取快速握手次数限制 */
  1168. virtual DWORD GetFastLimit () = 0;
  1169. /* 获取最大传输单元 */
  1170. virtual DWORD GetMaxTransUnit () = 0;
  1171. /* 获取最大数据包大小 */
  1172. virtual DWORD GetMaxMessageSize () = 0;
  1173. /* 获取握手超时时间 */
  1174. virtual DWORD GetHandShakeTimeout () = 0;
  1175. /* 获取等待发送包数量 */
  1176. virtual BOOL GetWaitingSendMessageCount (int& iCount) = 0;
  1177. public:
  1178. virtual ~IArqClient() {}
  1179. };
  1180. /************************************************************************
  1181. 名称:UDP ARQ 通信客户端组件接口
  1182. 描述:继承了 ARQ 和 Client 接口
  1183. ************************************************************************/
  1184. typedef DualInterface<IArqClient, IUdpClient> IUdpArqClient;
  1185. #endif
  1186. /************************************************************************
  1187. 名称:Server/Agent PULL 模型组件接口
  1188. 描述:定义 Server/Agent 组件的 PULL 模型组件的所有操作方法
  1189. ************************************************************************/
  1190. class IPullSocket
  1191. {
  1192. public:
  1193. /*
  1194. * 名称:抓取数据
  1195. * 描述:用户通过该方法从 Socket 组件中抓取数据
  1196. *
  1197. * 参数: dwConnID -- 连接 ID
  1198. * pData -- 抓取缓冲区
  1199. * iLength -- 抓取数据长度
  1200. * 返回值: EnFetchResult
  1201. */
  1202. virtual EnFetchResult Fetch (CONNID dwConnID, BYTE* pData, int iLength) = 0;
  1203. /*
  1204. * 名称:窥探数据(不会移除缓冲区数据)
  1205. * 描述:用户通过该方法从 Socket 组件中窥探数据
  1206. *
  1207. * 参数: dwConnID -- 连接 ID
  1208. * pData -- 窥探缓冲区
  1209. * iLength -- 窥探数据长度
  1210. * 返回值: EnFetchResult
  1211. */
  1212. virtual EnFetchResult Peek (CONNID dwConnID, BYTE* pData, int iLength) = 0;
  1213. public:
  1214. virtual ~IPullSocket() {}
  1215. };
  1216. /************************************************************************
  1217. 名称:Client PULL 模型组件接口
  1218. 描述:定义 Client 组件的 PULL 模型组件的所有操作方法
  1219. ************************************************************************/
  1220. class IPullClient
  1221. {
  1222. public:
  1223. /*
  1224. * 名称:抓取数据
  1225. * 描述:用户通过该方法从 Socket 组件中抓取数据
  1226. *
  1227. * 参数: pData -- 抓取缓冲区
  1228. * iLength -- 抓取数据长度
  1229. * 返回值: EnFetchResult
  1230. */
  1231. virtual EnFetchResult Fetch (BYTE* pData, int iLength) = 0;
  1232. /*
  1233. * 名称:窥探数据(不会移除缓冲区数据)
  1234. * 描述:用户通过该方法从 Socket 组件中窥探数据
  1235. *
  1236. * 参数: pData -- 窥探缓冲区
  1237. * iLength -- 窥探数据长度
  1238. * 返回值: EnFetchResult
  1239. */
  1240. virtual EnFetchResult Peek (BYTE* pData, int iLength) = 0;
  1241. public:
  1242. virtual ~IPullClient() {}
  1243. };
  1244. /************************************************************************
  1245. 名称:TCP PULL 模型组件接口
  1246. 描述:继承了 PULL 和 Socket 接口
  1247. ************************************************************************/
  1248. typedef DualInterface<IPullSocket, ITcpServer> ITcpPullServer;
  1249. typedef DualInterface<IPullSocket, ITcpAgent> ITcpPullAgent;
  1250. typedef DualInterface<IPullClient, ITcpClient> ITcpPullClient;
  1251. /************************************************************************
  1252. 名称:Server/Agent PACK 模型组件接口
  1253. 描述:定义 Server/Agent 组件的 PACK 模型组件的所有操作方法
  1254. ************************************************************************/
  1255. class IPackSocket
  1256. {
  1257. public:
  1258. /***********************************************************************/
  1259. /***************************** 属性访问方法 *****************************/
  1260. /* 设置数据包最大长度(有效数据包最大长度不能超过 4194303/0x3FFFFF 字节,默认:262144/0x40000) */
  1261. virtual void SetMaxPackSize (DWORD dwMaxPackSize) = 0;
  1262. /* 设置包头标识(有效包头标识取值范围 0 ~ 1023/0x3FF,当包头标识为 0 时不校验包头,默认:0) */
  1263. virtual void SetPackHeaderFlag (USHORT usPackHeaderFlag) = 0;
  1264. /* 获取数据包最大长度 */
  1265. virtual DWORD GetMaxPackSize () = 0;
  1266. /* 获取包头标识 */
  1267. virtual USHORT GetPackHeaderFlag() = 0;
  1268. public:
  1269. virtual ~IPackSocket() {}
  1270. };
  1271. /************************************************************************
  1272. 名称:Client PACK 模型组件接口
  1273. 描述:定义 Client 组件的 PACK 模型组件的所有操作方法
  1274. ************************************************************************/
  1275. class IPackClient
  1276. {
  1277. public:
  1278. /***********************************************************************/
  1279. /***************************** 属性访问方法 *****************************/
  1280. /* 设置数据包最大长度(有效数据包最大长度不能超过 4194303/0x3FFFFF 字节,默认:262144/0x40000) */
  1281. virtual void SetMaxPackSize (DWORD dwMaxPackSize) = 0;
  1282. /* 设置包头标识(有效包头标识取值范围 0 ~ 1023/0x3FF,当包头标识为 0 时不校验包头,默认:0) */
  1283. virtual void SetPackHeaderFlag (USHORT usPackHeaderFlag) = 0;
  1284. /* 获取数据包最大长度 */
  1285. virtual DWORD GetMaxPackSize () = 0;
  1286. /* 获取包头标识 */
  1287. virtual USHORT GetPackHeaderFlag() = 0;
  1288. public:
  1289. virtual ~IPackClient() {}
  1290. };
  1291. /************************************************************************
  1292. 名称:TCP PACK 模型组件接口
  1293. 描述:继承了 PACK 和 Socket 接口
  1294. ************************************************************************/
  1295. typedef DualInterface<IPackSocket, ITcpServer> ITcpPackServer;
  1296. typedef DualInterface<IPackSocket, ITcpAgent> ITcpPackAgent;
  1297. typedef DualInterface<IPackClient, ITcpClient> ITcpPackClient;
  1298. /************************************************************************
  1299. 名称:Socket 监听器基接口
  1300. 描述:定义组件监听器的公共方法
  1301. ************************************************************************/
  1302. template<class T> class ISocketListenerT
  1303. {
  1304. public:
  1305. /*
  1306. * 名称:握手完成通知
  1307. * 描述:连接完成握手时,Socket 监听器将收到该通知,监听器接收到该通知后才能开始
  1308. * 数据收发操作
  1309. *
  1310. * 参数: pSender -- 事件源对象
  1311. * dwConnID -- 连接 ID
  1312. * 返回值: HR_OK / HR_IGNORE -- 继续执行
  1313. * HR_ERROR -- 引发 OnClose() 事件并关闭连接
  1314. */
  1315. virtual EnHandleResult OnHandShake(T* pSender, CONNID dwConnID) = 0;
  1316. /*
  1317. * 名称:已发送数据通知
  1318. * 描述:成功发送数据后,Socket 监听器将收到该通知
  1319. *
  1320. * 参数: pSender -- 事件源对象
  1321. * dwConnID -- 连接 ID
  1322. * pData -- 已发送数据缓冲区
  1323. * iLength -- 已发送数据长度
  1324. * 返回值: HR_OK / HR_IGNORE -- 继续执行
  1325. * HR_ERROR -- 该通知不允许返回 HR_ERROR(调试模式下引发断言错误)
  1326. */
  1327. virtual EnHandleResult OnSend(T* pSender, CONNID dwConnID, const BYTE* pData, int iLength) = 0;
  1328. /*
  1329. * 名称:数据到达通知(PUSH 模型)
  1330. * 描述:对于 PUSH 模型的 Socket 通信组件,成功接收数据后将向 Socket 监听器发送该通知
  1331. *
  1332. * 参数: pSender -- 事件源对象
  1333. * dwConnID -- 连接 ID
  1334. * pData -- 已接收数据缓冲区
  1335. * iLength -- 已接收数据长度
  1336. * 返回值: HR_OK / HR_IGNORE -- 继续执行
  1337. * HR_ERROR -- 引发 OnClose() 事件并关闭连接
  1338. */
  1339. virtual EnHandleResult OnReceive(T* pSender, CONNID dwConnID, const BYTE* pData, int iLength) = 0;
  1340. /*
  1341. * 名称:数据到达通知(PULL 模型)
  1342. * 描述:对于 PULL 模型的 Socket 通信组件,成功接收数据后将向 Socket 监听器发送该通知
  1343. *
  1344. * 参数: pSender -- 事件源对象
  1345. * dwConnID -- 连接 ID
  1346. * iLength -- 已接收数据长度
  1347. * 返回值: HR_OK / HR_IGNORE -- 继续执行
  1348. * HR_ERROR -- 引发 OnClose() 事件并关闭连接
  1349. */
  1350. virtual EnHandleResult OnReceive(T* pSender, CONNID dwConnID, int iLength) = 0;
  1351. /*
  1352. * 名称:通信错误通知
  1353. * 描述:通信发生错误后,Socket 监听器将收到该通知,并关闭连接
  1354. *
  1355. * 参数: pSender -- 事件源对象
  1356. * dwConnID -- 连接 ID
  1357. * enOperation -- Socket 操作类型
  1358. * iErrorCode -- 错误代码
  1359. * 返回值: 忽略返回值
  1360. */
  1361. virtual EnHandleResult OnClose(T* pSender, CONNID dwConnID, EnSocketOperation enOperation, int iErrorCode) = 0;
  1362. public:
  1363. virtual ~ISocketListenerT() {}
  1364. };
  1365. template<class T> class IComplexSocketListenerT : public ISocketListenerT<T>
  1366. {
  1367. public:
  1368. /*
  1369. * 名称:关闭通信组件通知
  1370. * 描述:通信组件关闭时,Socket 监听器将收到该通知
  1371. *
  1372. * 参数: pSender -- 事件源对象
  1373. * 返回值: 忽略返回值
  1374. */
  1375. virtual EnHandleResult OnShutdown(T* pSender) = 0;
  1376. };
  1377. /************************************************************************
  1378. 名称:服务端 Socket 监听器接口
  1379. 描述:定义服务端 Socket 监听器的所有事件
  1380. ************************************************************************/
  1381. template<class T> class IServerListenerT : public IComplexSocketListenerT<T>
  1382. {
  1383. public:
  1384. /*
  1385. * 名称:准备监听通知
  1386. * 描述:通信服务端组件启动时,在监听 Socket 创建完成并开始执行监听前,Socket 监听
  1387. * 器将收到该通知,监听器可以在通知处理方法中执行 Socket 选项设置等额外工作
  1388. *
  1389. * 参数: pSender -- 事件源对象
  1390. * soListen -- 监听 Socket
  1391. * 返回值: HR_OK / HR_IGNORE -- 继续执行
  1392. * HR_ERROR -- 终止启动通信服务组件
  1393. */
  1394. virtual EnHandleResult OnPrepareListen(T* pSender, SOCKET soListen) = 0;
  1395. /*
  1396. * 名称:接收连接通知
  1397. * 描述:接收到客户端连接请求时,Socket 监听器将收到该通知,监听器可以在通知处理方
  1398. * 法中执行 Socket 选项设置或拒绝客户端连接等额外工作
  1399. *
  1400. * 参数: pSender -- 事件源对象
  1401. * dwConnID -- 连接 ID
  1402. * soClient -- TCP: 客户端 Socket 句柄,UDP: 客户端 Socket SOCKADDR 指针
  1403. * 返回值: HR_OK / HR_IGNORE -- 接受连接
  1404. * HR_ERROR -- 拒绝连接
  1405. */
  1406. virtual EnHandleResult OnAccept(T* pSender, CONNID dwConnID, UINT_PTR soClient) = 0;
  1407. };
  1408. /************************************************************************
  1409. 名称:TCP 服务端 Socket 监听器接口
  1410. 描述:定义 TCP 服务端 Socket 监听器的所有事件
  1411. ************************************************************************/
  1412. class ITcpServerListener : public IServerListenerT<ITcpServer>
  1413. {
  1414. public:
  1415. };
  1416. /************************************************************************
  1417. 名称:PUSH 模型服务端 Socket 监听器抽象基类
  1418. 描述:定义某些事件的默认处理方法(忽略事件)
  1419. ************************************************************************/
  1420. class CTcpServerListener : public ITcpServerListener
  1421. {
  1422. public:
  1423. virtual EnHandleResult OnPrepareListen(ITcpServer* pSender, SOCKET soListen) {return HR_IGNORE;}
  1424. virtual EnHandleResult OnAccept(ITcpServer* pSender, CONNID dwConnID, UINT_PTR soClient) {return HR_IGNORE;}
  1425. virtual EnHandleResult OnHandShake(ITcpServer* pSender, CONNID dwConnID) {return HR_IGNORE;}
  1426. virtual EnHandleResult OnReceive(ITcpServer* pSender, CONNID dwConnID, int iLength) {return HR_IGNORE;}
  1427. virtual EnHandleResult OnSend(ITcpServer* pSender, CONNID dwConnID, const BYTE* pData, int iLength) {return HR_IGNORE;}
  1428. virtual EnHandleResult OnShutdown(ITcpServer* pSender) {return HR_IGNORE;}
  1429. };
  1430. /************************************************************************
  1431. 名称:PULL 模型服务端 Socket 监听器抽象基类
  1432. 描述:定义某些事件的默认处理方法(忽略事件)
  1433. ************************************************************************/
  1434. class CTcpPullServerListener : public CTcpServerListener
  1435. {
  1436. public:
  1437. virtual EnHandleResult OnReceive(ITcpServer* pSender, CONNID dwConnID, int iLength) = 0;
  1438. virtual EnHandleResult OnReceive(ITcpServer* pSender, CONNID dwConnID, const BYTE* pData, int iLength) {return HR_IGNORE;}
  1439. };
  1440. #ifdef _UDP_SUPPORT
  1441. /************************************************************************
  1442. 名称:UDP 服务端 Socket 监听器接口
  1443. 描述:定义 UDP 服务端 Socket 监听器的所有事件
  1444. ************************************************************************/
  1445. class IUdpServerListener : public IServerListenerT<IUdpServer>
  1446. {
  1447. public:
  1448. };
  1449. /************************************************************************
  1450. 名称:UDP 服务端 Socket 监听器抽象基类
  1451. 描述:定义某些事件的默认处理方法(忽略事件)
  1452. ************************************************************************/
  1453. class CUdpServerListener : public IUdpServerListener
  1454. {
  1455. public:
  1456. virtual EnHandleResult OnPrepareListen(IUdpServer* pSender, SOCKET soListen) {return HR_IGNORE;}
  1457. virtual EnHandleResult OnAccept(IUdpServer* pSender, CONNID dwConnID, UINT_PTR pSockAddr) {return HR_IGNORE;}
  1458. virtual EnHandleResult OnHandShake(IUdpServer* pSender, CONNID dwConnID) {return HR_IGNORE;}
  1459. virtual EnHandleResult OnReceive(IUdpServer* pSender, CONNID dwConnID, int iLength) {return HR_IGNORE;}
  1460. virtual EnHandleResult OnSend(IUdpServer* pSender, CONNID dwConnID, const BYTE* pData, int iLength) {return HR_IGNORE;}
  1461. virtual EnHandleResult OnShutdown(IUdpServer* pSender) {return HR_IGNORE;}
  1462. };
  1463. #endif
  1464. /************************************************************************
  1465. 名称:通信代理 Socket 监听器接口
  1466. 描述:定义 通信代理 Socket 监听器的所有事件
  1467. ************************************************************************/
  1468. template<class T> class IAgentListenerT : public IComplexSocketListenerT<T>
  1469. {
  1470. public:
  1471. /*
  1472. * 名称:准备连接通知
  1473. * 描述:通信客户端组件启动时,在客户端 Socket 创建完成并开始执行连接前,Socket 监听
  1474. * 器将收到该通知,监听器可以在通知处理方法中执行 Socket 选项设置等额外工作
  1475. *
  1476. * 参数: pSender -- 事件源对象
  1477. * dwConnID -- 连接 ID
  1478. * socket -- 客户端 Socket
  1479. * 返回值: HR_OK / HR_IGNORE -- 继续执行
  1480. * HR_ERROR -- 终止启动通信客户端组件
  1481. */
  1482. virtual EnHandleResult OnPrepareConnect(T* pSender, CONNID dwConnID, SOCKET socket) = 0;
  1483. /*
  1484. * 名称:连接完成通知
  1485. * 描述:与服务端成功建立连接时,Socket 监听器将收到该通知
  1486. *
  1487. * 参数: pSender -- 事件源对象
  1488. * dwConnID -- 连接 ID
  1489. * 返回值: HR_OK / HR_IGNORE -- 继续执行
  1490. * HR_ERROR -- 同步连接:终止启动通信客户端组件
  1491. * 异步连接:关闭连接
  1492. */
  1493. virtual EnHandleResult OnConnect(T* pSender, CONNID dwConnID) = 0;
  1494. };
  1495. /************************************************************************
  1496. 名称:TCP 通信代理 Socket 监听器接口
  1497. 描述:定义 TCP 通信代理 Socket 监听器的所有事件
  1498. ************************************************************************/
  1499. class ITcpAgentListener : public IAgentListenerT<ITcpAgent>
  1500. {
  1501. public:
  1502. };
  1503. /************************************************************************
  1504. 名称:PUSH 模型通信代理 Socket 监听器抽象基类
  1505. 描述:定义某些事件的默认处理方法(忽略事件)
  1506. ************************************************************************/
  1507. class CTcpAgentListener : public ITcpAgentListener
  1508. {
  1509. public:
  1510. virtual EnHandleResult OnPrepareConnect(ITcpAgent* pSender, CONNID dwConnID, SOCKET socket) {return HR_IGNORE;}
  1511. virtual EnHandleResult OnConnect(ITcpAgent* pSender, CONNID dwConnID) {return HR_IGNORE;}
  1512. virtual EnHandleResult OnHandShake(ITcpAgent* pSender, CONNID dwConnID) {return HR_IGNORE;}
  1513. virtual EnHandleResult OnReceive(ITcpAgent* pSender, CONNID dwConnID, int iLength) {return HR_IGNORE;}
  1514. virtual EnHandleResult OnSend(ITcpAgent* pSender, CONNID dwConnID, const BYTE* pData, int iLength) {return HR_IGNORE;}
  1515. virtual EnHandleResult OnShutdown(ITcpAgent* pSender) {return HR_IGNORE;}
  1516. };
  1517. /************************************************************************
  1518. 名称:PULL 通信代理 Socket 监听器抽象基类
  1519. 描述:定义某些事件的默认处理方法(忽略事件)
  1520. ************************************************************************/
  1521. class CTcpPullAgentListener : public CTcpAgentListener
  1522. {
  1523. public:
  1524. virtual EnHandleResult OnReceive(ITcpAgent* pSender, CONNID dwConnID, int iLength) = 0;
  1525. virtual EnHandleResult OnReceive(ITcpAgent* pSender, CONNID dwConnID, const BYTE* pData, int iLength) {return HR_IGNORE;}
  1526. };
  1527. /************************************************************************
  1528. 名称:客户端 Socket 监听器接口
  1529. 描述:定义客户端 Socket 监听器的所有事件
  1530. ************************************************************************/
  1531. template<class T> class IClientListenerT : public ISocketListenerT<T>
  1532. {
  1533. public:
  1534. /*
  1535. * 名称:准备连接通知
  1536. * 描述:通信客户端组件启动时,在客户端 Socket 创建完成并开始执行连接前,Socket 监听
  1537. * 器将收到该通知,监听器可以在通知处理方法中执行 Socket 选项设置等额外工作
  1538. *
  1539. * 参数: pSender -- 事件源对象
  1540. * dwConnID -- 连接 ID
  1541. * socket -- 客户端 Socket
  1542. * 返回值: HR_OK / HR_IGNORE -- 继续执行
  1543. * HR_ERROR -- 终止启动通信客户端组件
  1544. */
  1545. virtual EnHandleResult OnPrepareConnect(T* pSender, CONNID dwConnID, SOCKET socket) = 0;
  1546. /*
  1547. * 名称:连接完成通知
  1548. * 描述:与服务端成功建立连接时,Socket 监听器将收到该通知
  1549. *
  1550. * 参数: pSender -- 事件源对象
  1551. * dwConnID -- 连接 ID
  1552. * 返回值: HR_OK / HR_IGNORE -- 继续执行
  1553. * HR_ERROR -- 同步连接:终止启动通信客户端组件
  1554. * 异步连接:关闭连接
  1555. */
  1556. virtual EnHandleResult OnConnect(T* pSender, CONNID dwConnID) = 0;
  1557. };
  1558. /************************************************************************
  1559. 名称:TCP 客户端 Socket 监听器接口
  1560. 描述:定义 TCP 客户端 Socket 监听器的所有事件
  1561. ************************************************************************/
  1562. class ITcpClientListener : public IClientListenerT<ITcpClient>
  1563. {
  1564. public:
  1565. };
  1566. /************************************************************************
  1567. 名称:PUSH 模型客户端 Socket 监听器抽象基类
  1568. 描述:定义某些事件的默认处理方法(忽略事件)
  1569. ************************************************************************/
  1570. class CTcpClientListener : public ITcpClientListener
  1571. {
  1572. public:
  1573. virtual EnHandleResult OnPrepareConnect(ITcpClient* pSender, CONNID dwConnID, SOCKET socket) {return HR_IGNORE;}
  1574. virtual EnHandleResult OnConnect(ITcpClient* pSender, CONNID dwConnID) {return HR_IGNORE;}
  1575. virtual EnHandleResult OnHandShake(ITcpClient* pSender, CONNID dwConnID) {return HR_IGNORE;}
  1576. virtual EnHandleResult OnReceive(ITcpClient* pSender, CONNID dwConnID, int iLength) {return HR_IGNORE;}
  1577. virtual EnHandleResult OnSend(ITcpClient* pSender, CONNID dwConnID, const BYTE* pData, int iLength) {return HR_IGNORE;}
  1578. };
  1579. /************************************************************************
  1580. 名称:PULL 客户端 Socket 监听器抽象基类
  1581. 描述:定义某些事件的默认处理方法(忽略事件)
  1582. ************************************************************************/
  1583. class CTcpPullClientListener : public CTcpClientListener
  1584. {
  1585. public:
  1586. virtual EnHandleResult OnReceive(ITcpClient* pSender, CONNID dwConnID, int iLength) = 0;
  1587. virtual EnHandleResult OnReceive(ITcpClient* pSender, CONNID dwConnID, const BYTE* pData, int iLength) {return HR_IGNORE;}
  1588. };
  1589. #ifdef _UDP_SUPPORT
  1590. /************************************************************************
  1591. 名称:UDP 客户端 Socket 监听器接口
  1592. 描述:定义 UDP 客户端 Socket 监听器的所有事件
  1593. ************************************************************************/
  1594. class IUdpClientListener : public IClientListenerT<IUdpClient>
  1595. {
  1596. public:
  1597. };
  1598. /************************************************************************
  1599. 名称:UDP 户端 Socket 监听器抽象基类
  1600. 描述:定义某些事件的默认处理方法(忽略事件)
  1601. ************************************************************************/
  1602. class CUdpClientListener : public IUdpClientListener
  1603. {
  1604. public:
  1605. virtual EnHandleResult OnPrepareConnect(IUdpClient* pSender, CONNID dwConnID, SOCKET socket) {return HR_IGNORE;}
  1606. virtual EnHandleResult OnConnect(IUdpClient* pSender, CONNID dwConnID) {return HR_IGNORE;}
  1607. virtual EnHandleResult OnHandShake(IUdpClient* pSender, CONNID dwConnID) {return HR_IGNORE;}
  1608. virtual EnHandleResult OnReceive(IUdpClient* pSender, CONNID dwConnID, int iLength) {return HR_IGNORE;}
  1609. virtual EnHandleResult OnSend(IUdpClient* pSender, CONNID dwConnID, const BYTE* pData, int iLength) {return HR_IGNORE;}
  1610. };
  1611. /************************************************************************
  1612. 名称:UDP 传播 Socket 监听器接口
  1613. 描述:定义 UDP 传播 Socket 监听器的所有事件
  1614. ************************************************************************/
  1615. class IUdpCastListener : public IClientListenerT<IUdpCast>
  1616. {
  1617. public:
  1618. };
  1619. /************************************************************************
  1620. 名称:UDP 传播 Socket 监听器抽象基类
  1621. 描述:定义某些事件的默认处理方法(忽略事件)
  1622. ************************************************************************/
  1623. class CUdpCastListener : public IUdpCastListener
  1624. {
  1625. public:
  1626. virtual EnHandleResult OnPrepareConnect(IUdpCast* pSender, CONNID dwConnID, SOCKET socket) {return HR_IGNORE;}
  1627. virtual EnHandleResult OnConnect(IUdpCast* pSender, CONNID dwConnID) {return HR_IGNORE;}
  1628. virtual EnHandleResult OnHandShake(IUdpCast* pSender, CONNID dwConnID) {return HR_IGNORE;}
  1629. virtual EnHandleResult OnReceive(IUdpCast* pSender, CONNID dwConnID, int iLength) {return HR_IGNORE;}
  1630. virtual EnHandleResult OnSend(IUdpCast* pSender, CONNID dwConnID, const BYTE* pData, int iLength) {return HR_IGNORE;}
  1631. };
  1632. /************************************************************************
  1633. 名称:UDP 节点 Socket 监听器接口
  1634. 描述:定义 UDP 节点 Socket 监听器的所有事件
  1635. ************************************************************************/
  1636. class IUdpNodeListener
  1637. {
  1638. public:
  1639. /*
  1640. * 名称:准备监听通知
  1641. * 描述:通信组件启动时,在监听 Socket 创建完成并开始执行监听前,Socket 监听器
  1642. * 将收到该通知,监听器可以在通知处理方法中执行 Socket 选项设置等额外工作
  1643. *
  1644. * 参数: pSender -- 事件源对象
  1645. * soListen -- 监听 Socket
  1646. * 返回值: HR_OK / HR_IGNORE -- 继续执行
  1647. * HR_ERROR -- 终止启动通信服务组件
  1648. */
  1649. virtual EnHandleResult OnPrepareListen(IUdpNode* pSender, SOCKET soListen) = 0;
  1650. /*
  1651. * 名称:已发送数据通知
  1652. * 描述:成功发送数据后,Socket 监听器将收到该通知
  1653. *
  1654. * 参数: pSender -- 事件源对象
  1655. * lpszRemoteAddress -- 远程地址
  1656. * usRemotePort -- 远程端口
  1657. * pData -- 已发送数据缓冲区
  1658. * iLength -- 已发送数据长度
  1659. * 返回值: 忽略返回值
  1660. */
  1661. virtual EnHandleResult OnSend(IUdpNode* pSender, LPCTSTR lpszRemoteAddress, USHORT usRemotePort, const BYTE* pData, int iLength) = 0;
  1662. /*
  1663. * 名称:数据到达通知(PUSH 模型)
  1664. * 描述:成功接收数据后,Socket 监听器将收到该通知
  1665. *
  1666. * 参数: pSender -- 事件源对象
  1667. * lpszRemoteAddress -- 远程地址
  1668. * usRemotePort -- 远程端口
  1669. * pData -- 已发送数据缓冲区
  1670. * iLength -- 已发送数据长度
  1671. * 返回值: 忽略返回值
  1672. */
  1673. virtual EnHandleResult OnReceive(IUdpNode* pSender, LPCTSTR lpszRemoteAddress, USHORT usRemotePort, const BYTE* pData, int iLength) = 0;
  1674. /*
  1675. * 名称:通信错误通知
  1676. * 描述:通信发生错误后,Socket 监听器将收到该通知
  1677. *
  1678. * 参数: pSender -- 事件源对象
  1679. * lpszRemoteAddress -- 远程地址
  1680. * usRemotePort -- 远程端口
  1681. * enOperation -- Socket 操作类型
  1682. * iErrorCode -- 错误代码
  1683. * pData -- 本次事件关联的数据缓冲区
  1684. * iLength -- 本次事件关联的数据长度
  1685. * 返回值: 忽略返回值
  1686. */
  1687. virtual EnHandleResult OnError(IUdpNode* pSender, EnSocketOperation enOperation, int iErrorCode, LPCTSTR lpszRemoteAddress, USHORT usRemotePort, const BYTE* pData, int iLength) = 0;
  1688. /*
  1689. * 名称:关闭通信组件通知
  1690. * 描述:通信组件关闭时,Socket 监听器将收到该通知
  1691. *
  1692. * 参数: pSender -- 事件源对象
  1693. * 返回值: 忽略返回值
  1694. */
  1695. virtual EnHandleResult OnShutdown(IUdpNode* pSender) = 0;
  1696. public:
  1697. virtual ~IUdpNodeListener() {}
  1698. };
  1699. /************************************************************************
  1700. 名称:UDP 节点 Socket 监听器抽象基类
  1701. 描述:定义某些事件的默认处理方法(忽略事件)
  1702. ************************************************************************/
  1703. class CUdpNodeListener : public IUdpNodeListener
  1704. {
  1705. public:
  1706. virtual EnHandleResult OnPrepareListen(IUdpNode* pSender, SOCKET soListen) {return HR_IGNORE;}
  1707. virtual EnHandleResult OnSend(IUdpNode* pSender, LPCTSTR lpszRemoteAddress, USHORT usRemotePort, const BYTE* pData, int iLength) {return HR_IGNORE;}
  1708. virtual EnHandleResult OnShutdown(IUdpNode* pSender) {return HR_IGNORE;}
  1709. };
  1710. #endif
  1711. /*****************************************************************************************************************************************************/
  1712. /****************************************************************** HTTP Interfaces ******************************************************************/
  1713. /*****************************************************************************************************************************************************/
  1714. #ifdef _HTTP_SUPPORT
  1715. /************************************************************************
  1716. 名称:复合 Http 组件接口
  1717. 描述:定义复合 Http 组件的所有操作方法和属性访问方法,复合 Http 组件同时管理多个 Http 连接
  1718. ************************************************************************/
  1719. class IComplexHttp
  1720. {
  1721. public:
  1722. /***********************************************************************/
  1723. /***************************** 组件操作方法 *****************************/
  1724. /*
  1725. * 名称:启动 HTTP 通信
  1726. * 描述:当通信组件设置为非自动启动 HTTP 通信时,需要调用本方法启动 HTTP 通信
  1727. *
  1728. * 返回值: TRUE -- 成功
  1729. * FALSE -- 失败,可通过 SYS_GetLastError() 获取失败原因
  1730. */
  1731. virtual BOOL StartHttp(CONNID dwConnID) = 0;
  1732. /*
  1733. * 名称:发送 Chunked 数据分片
  1734. * 描述:向对端发送 Chunked 数据分片
  1735. *
  1736. * 参数: dwConnID -- 连接 ID
  1737. * pData -- Chunked 数据分片
  1738. * iLength -- 数据分片长度(为 0 表示结束分片)
  1739. * lpszExtensions -- 扩展属性(默认:nullptr)
  1740. * 返回值: TRUE -- 成功
  1741. * FALSE -- 失败
  1742. */
  1743. virtual BOOL SendChunkData(CONNID dwConnID, const BYTE* pData = nullptr, int iLength = 0, LPCSTR lpszExtensions = nullptr) = 0;
  1744. public:
  1745. /***********************************************************************/
  1746. /***************************** 属性访问方法 *****************************/
  1747. /* 设置本地协议版本 */
  1748. virtual void SetLocalVersion(EnHttpVersion usVersion) = 0;
  1749. /* 获取本地协议版本 */
  1750. virtual EnHttpVersion GetLocalVersion() = 0;
  1751. /* 检查是否升级协议 */
  1752. virtual BOOL IsUpgrade(CONNID dwConnID) = 0;
  1753. /* 检查是否有 Keep-Alive 标识 */
  1754. virtual BOOL IsKeepAlive(CONNID dwConnID) = 0;
  1755. /* 获取协议版本 */
  1756. virtual USHORT GetVersion(CONNID dwConnID) = 0;
  1757. /* 获取内容长度 */
  1758. virtual ULONGLONG GetContentLength(CONNID dwConnID) = 0;
  1759. /* 获取内容类型 */
  1760. virtual LPCSTR GetContentType(CONNID dwConnID) = 0;
  1761. /* 获取内容编码 */
  1762. virtual LPCSTR GetContentEncoding(CONNID dwConnID) = 0;
  1763. /* 获取传输编码 */
  1764. virtual LPCSTR GetTransferEncoding(CONNID dwConnID) = 0;
  1765. /* 获取协议升级类型 */
  1766. virtual EnHttpUpgradeType GetUpgradeType(CONNID dwConnID) = 0;
  1767. /* 获取解析错误代码 */
  1768. virtual USHORT GetParseErrorCode(CONNID dwConnID, LPCSTR* lpszErrorDesc = nullptr) = 0;
  1769. /* 获取某个请求头(单值) */
  1770. virtual BOOL GetHeader(CONNID dwConnID, LPCSTR lpszName, LPCSTR* lpszValue) = 0;
  1771. /* 获取某个请求头(多值) */
  1772. virtual BOOL GetHeaders(CONNID dwConnID, LPCSTR lpszName, LPCSTR lpszValue[], DWORD& dwCount) = 0;
  1773. /* 获取所有请求头 */
  1774. virtual BOOL GetAllHeaders(CONNID dwConnID, THeader lpHeaders[], DWORD& dwCount) = 0;
  1775. /* 获取所有请求头名称 */
  1776. virtual BOOL GetAllHeaderNames(CONNID dwConnID, LPCSTR lpszName[], DWORD& dwCount) = 0;
  1777. /* 获取 Cookie */
  1778. virtual BOOL GetCookie(CONNID dwConnID, LPCSTR lpszName, LPCSTR* lpszValue) = 0;
  1779. /* 获取所有 Cookie */
  1780. virtual BOOL GetAllCookies(CONNID dwConnID, TCookie lpCookies[], DWORD& dwCount) = 0;
  1781. /*
  1782. // !! maybe implemented in future !! //
  1783. virtual BOOL GetParam(CONNID dwConnID, LPCSTR lpszName, LPCSTR* lpszValue) = 0;
  1784. virtual BOOL GetParams(CONNID dwConnID, LPCSTR lpszName, LPCSTR lpszValue[], DWORD& dwCount) = 0;
  1785. virtual BOOL GetAllParams(CONNID dwConnID, LPPARAM lpszParam[], DWORD& dwCount) = 0;
  1786. virtual BOOL GetAllParamNames(CONNID dwConnID, LPCSTR lpszName[], DWORD& dwCount) = 0;
  1787. */
  1788. /* 获取当前 WebSocket 消息状态,传入 nullptr 则不获取相应字段 */
  1789. virtual BOOL GetWSMessageState(CONNID dwConnID, BOOL* lpbFinal, BYTE* lpiReserved, BYTE* lpiOperationCode, LPCBYTE* lpszMask, ULONGLONG* lpullBodyLen, ULONGLONG* lpullBodyRemain) = 0;
  1790. /* 设置 HTTP 启动方式(默认:TRUE,自动启动) */
  1791. virtual void SetHttpAutoStart(BOOL bAutoStart) = 0;
  1792. /* 获取 HTTP 启动方式 */
  1793. virtual BOOL IsHttpAutoStart() = 0;
  1794. public:
  1795. virtual ~IComplexHttp() {}
  1796. };
  1797. /************************************************************************
  1798. 名称:复合 Http 请求者组件接口
  1799. 描述:定义复合 Http 请求者组件的所有操作方法和属性访问方法
  1800. ************************************************************************/
  1801. class IComplexHttpRequester : public IComplexHttp
  1802. {
  1803. public:
  1804. /***********************************************************************/
  1805. /***************************** 组件操作方法 *****************************/
  1806. /*
  1807. * 名称:发送 WebSocket 消息
  1808. * 描述:向对端端发送 WebSocket 消息
  1809. *
  1810. * 参数: dwConnID -- 连接 ID
  1811. * bFinal -- 是否结束帧
  1812. * iReserved -- RSV1/RSV2/RSV3 各 1 位
  1813. * iOperationCode -- 操作码:0x0 - 0xF
  1814. * lpszMask -- 掩码(nullptr 或 4 字节掩码,如果为 nullptr 则没有掩码)
  1815. * pData -- 消息体数据缓冲区
  1816. * iLength -- 消息体数据长度
  1817. * ullBodyLen -- 消息总长度
  1818. * ullBodyLen = 0 -> 消息总长度为 iLength
  1819. * ullBodyLen = iLength -> 消息总长度为 ullBodyLen
  1820. * ullBodyLen > iLength -> 消息总长度为 ullBodyLen,后续消息体长度为 ullBOdyLen - iLength,后续消息体通过底层方法 Send() / SendPackets() 发送
  1821. * ullBodyLen < iLength -> 错误参数,发送失败
  1822. * 返回值: TRUE -- 成功
  1823. * FALSE -- 失败
  1824. */
  1825. virtual BOOL SendWSMessage(CONNID dwConnID, BOOL bFinal, BYTE iReserved, BYTE iOperationCode, const BYTE lpszMask[4], const BYTE* pData = nullptr, int iLength = 0, ULONGLONG ullBodyLen = 0) = 0;
  1826. /*
  1827. * 名称:发送请求
  1828. * 描述:向服务端发送 HTTP 请求
  1829. *
  1830. * 参数: dwConnID -- 连接 ID
  1831. * lpszMethod -- 请求方法
  1832. * lpszPath -- 请求路径
  1833. * lpHeaders -- 请求头
  1834. * iHeaderCount -- 请求头数量
  1835. * pBody -- 请求体
  1836. * iLength -- 请求体长度
  1837. * 返回值: TRUE -- 成功
  1838. * FALSE -- 失败
  1839. */
  1840. virtual BOOL SendRequest(CONNID dwConnID, LPCSTR lpszMethod, LPCSTR lpszPath, const THeader lpHeaders[] = nullptr, int iHeaderCount = 0, const BYTE* pBody = nullptr, int iLength = 0) = 0;
  1841. /*
  1842. * 名称:发送本地文件
  1843. * 描述:向指定连接发送 4096 KB 以下的小文件
  1844. *
  1845. * 参数: dwConnID -- 连接 ID
  1846. * lpszFileName -- 文件路径
  1847. * lpszMethod -- 请求方法
  1848. * lpszPath -- 请求路径
  1849. * lpHeaders -- 请求头
  1850. * iHeaderCount -- 请求头数量
  1851. * 返回值: TRUE -- 成功
  1852. * FALSE -- 失败
  1853. */
  1854. virtual BOOL SendLocalFile(CONNID dwConnID, LPCSTR lpszFileName, LPCSTR lpszMethod, LPCSTR lpszPath, const THeader lpHeaders[] = nullptr, int iHeaderCount = 0) = 0;
  1855. /* 发送 POST 请求 */
  1856. virtual BOOL SendPost(CONNID dwConnID, LPCSTR lpszPath, const THeader lpHeaders[], int iHeaderCount, const BYTE* pBody, int iLength) = 0;
  1857. /* 发送 PUT 请求 */
  1858. virtual BOOL SendPut(CONNID dwConnID, LPCSTR lpszPath, const THeader lpHeaders[], int iHeaderCount, const BYTE* pBody, int iLength) = 0;
  1859. /* 发送 PATCH 请求 */
  1860. virtual BOOL SendPatch(CONNID dwConnID, LPCSTR lpszPath, const THeader lpHeaders[], int iHeaderCount, const BYTE* pBody, int iLength) = 0;
  1861. /* 发送 GET 请求 */
  1862. virtual BOOL SendGet(CONNID dwConnID, LPCSTR lpszPath, const THeader lpHeaders[] = nullptr, int iHeaderCount = 0) = 0;
  1863. /* 发送 DELETE 请求 */
  1864. virtual BOOL SendDelete(CONNID dwConnID, LPCSTR lpszPath, const THeader lpHeaders[] = nullptr, int iHeaderCount = 0) = 0;
  1865. /* 发送 HEAD 请求 */
  1866. virtual BOOL SendHead(CONNID dwConnID, LPCSTR lpszPath, const THeader lpHeaders[] = nullptr, int iHeaderCount = 0) = 0;
  1867. /* 发送 TRACE 请求 */
  1868. virtual BOOL SendTrace(CONNID dwConnID, LPCSTR lpszPath, const THeader lpHeaders[] = nullptr, int iHeaderCount = 0) = 0;
  1869. /* 发送 OPTIONS 请求 */
  1870. virtual BOOL SendOptions(CONNID dwConnID, LPCSTR lpszPath, const THeader lpHeaders[] = nullptr, int iHeaderCount = 0) = 0;
  1871. /* 发送 CONNECT 请求 */
  1872. virtual BOOL SendConnect(CONNID dwConnID, LPCSTR lpszHost, const THeader lpHeaders[] = nullptr, int iHeaderCount = 0) = 0;
  1873. public:
  1874. /***********************************************************************/
  1875. /***************************** 属性访问方法 *****************************/
  1876. /* 获取 HTTP 状态码 */
  1877. virtual USHORT GetStatusCode(CONNID dwConnID) = 0;
  1878. /* 设置是否使用 Cookie(默认:TRUE) */
  1879. virtual void SetUseCookie(BOOL bUseCookie) = 0;
  1880. /* 检查是否使用 Cookie */
  1881. virtual BOOL IsUseCookie() = 0;
  1882. };
  1883. /************************************************************************
  1884. 名称:复合 Http 响应者组件接口
  1885. 描述:定义复合 Http 响应者组件的所有操作方法和属性访问方法
  1886. ************************************************************************/
  1887. class IComplexHttpResponder : public IComplexHttp
  1888. {
  1889. public:
  1890. /***********************************************************************/
  1891. /***************************** 组件操作方法 *****************************/
  1892. /*
  1893. * 名称:发送 WebSocket 消息
  1894. * 描述:向对端端发送 WebSocket 消息
  1895. *
  1896. * 参数: dwConnID -- 连接 ID
  1897. * bFinal -- 是否结束帧
  1898. * iReserved -- RSV1/RSV2/RSV3 各 1 位
  1899. * iOperationCode -- 操作码:0x0 - 0xF
  1900. * pData -- 消息体数据缓冲区
  1901. * iLength -- 消息体数据长度
  1902. * ullBodyLen -- 消息总长度
  1903. * ullBodyLen = 0 -> 消息总长度为 iLength
  1904. * ullBodyLen = iLength -> 消息总长度为 ullBodyLen
  1905. * ullBodyLen > iLength -> 消息总长度为 ullBodyLen,后续消息体长度为 ullBOdyLen - iLength,后续消息体通过底层方法 Send() / SendPackets() 发送
  1906. * ullBodyLen < iLength -> 错误参数,发送失败
  1907. * 返回值: TRUE -- 成功
  1908. * FALSE -- 失败
  1909. */
  1910. virtual BOOL SendWSMessage(CONNID dwConnID, BOOL bFinal, BYTE iReserved, BYTE iOperationCode, const BYTE* pData = nullptr, int iLength = 0, ULONGLONG ullBodyLen = 0) = 0;
  1911. /*
  1912. * 名称:回复请求
  1913. * 描述:向客户端回复 HTTP 请求
  1914. *
  1915. * 参数: dwConnID -- 连接 ID
  1916. * usStatusCode -- HTTP 状态码
  1917. * lpszDesc -- HTTP 状态描述
  1918. * lpHeaders -- 回复请求头
  1919. * iHeaderCount -- 回复请求头数量
  1920. * pData -- 回复请求体
  1921. * iLength -- 回复请求体长度
  1922. * 返回值: TRUE -- 成功
  1923. * FALSE -- 失败
  1924. */
  1925. virtual BOOL SendResponse(CONNID dwConnID, USHORT usStatusCode, LPCSTR lpszDesc = nullptr, const THeader lpHeaders[] = nullptr, int iHeaderCount = 0, const BYTE* pData = nullptr, int iLength = 0) = 0;
  1926. /*
  1927. * 名称:发送本地文件
  1928. * 描述:向指定连接发送 4096 KB 以下的小文件
  1929. *
  1930. * 参数: dwConnID -- 连接 ID
  1931. * lpszFileName -- 文件路径
  1932. * usStatusCode -- HTTP 状态码
  1933. * lpszDesc -- HTTP 状态描述
  1934. * lpHeaders -- 回复请求头
  1935. * iHeaderCount -- 回复请求头数量
  1936. * 返回值: TRUE -- 成功
  1937. * FALSE -- 失败
  1938. */
  1939. virtual BOOL SendLocalFile(CONNID dwConnID, LPCSTR lpszFileName, USHORT usStatusCode = HSC_OK, LPCSTR lpszDesc = nullptr, const THeader lpHeaders[] = nullptr, int iHeaderCount = 0) = 0;
  1940. /*
  1941. * 名称:释放连接
  1942. * 描述:把连接放入释放队列,等待某个时间(通过 SetReleaseDelay() 设置)关闭连接
  1943. *
  1944. * 参数: dwConnID -- 连接 ID
  1945. * 返回值: TRUE -- 成功
  1946. * FALSE -- 失败
  1947. */
  1948. virtual BOOL Release(CONNID dwConnID) = 0;
  1949. public:
  1950. /***********************************************************************/
  1951. /***************************** 属性访问方法 *****************************/
  1952. /* 获取主机 */
  1953. virtual LPCSTR GetHost(CONNID dwConnID) = 0;
  1954. /* 设置连接释放延时(默认:3000 毫秒) */
  1955. virtual void SetReleaseDelay(DWORD dwReleaseDelay) = 0;
  1956. /* 获取连接释放延时 */
  1957. virtual DWORD GetReleaseDelay() = 0;
  1958. /* 获取请求行 URL 域掩码(URL 域参考:EnHttpUrlField) */
  1959. virtual USHORT GetUrlFieldSet(CONNID dwConnID) = 0;
  1960. /* 获取某个 URL 域值 */
  1961. virtual LPCSTR GetUrlField(CONNID dwConnID, EnHttpUrlField enField) = 0;
  1962. /* 获取请求方法 */
  1963. virtual LPCSTR GetMethod(CONNID dwConnID) = 0;
  1964. };
  1965. /************************************************************************
  1966. 名称:简单 HTTP 组件接口
  1967. 描述:定义 简单 HTTP 组件的所有操作方法和属性访问方法
  1968. ************************************************************************/
  1969. class IHttp
  1970. {
  1971. public:
  1972. /***********************************************************************/
  1973. /***************************** 组件操作方法 *****************************/
  1974. /*
  1975. * 名称:发送 WebSocket 消息
  1976. * 描述:向对端端发送 WebSocket 消息
  1977. *
  1978. * 参数: bFinal -- 是否结束帧
  1979. * iReserved -- RSV1/RSV2/RSV3 各 1 位
  1980. * iOperationCode -- 操作码:0x0 - 0xF
  1981. * lpszMask -- 掩码(nullptr 或 4 字节掩码,如果为 nullptr 则没有掩码)
  1982. * pData -- 消息体数据缓冲区
  1983. * iLength -- 消息体数据长度
  1984. * ullBodyLen -- 消息总长度
  1985. * ullBodyLen = 0 -> 消息总长度为 iLength
  1986. * ullBodyLen = iLength -> 消息总长度为 ullBodyLen
  1987. * ullBodyLen > iLength -> 消息总长度为 ullBodyLen,后续消息体长度为 ullBOdyLen - iLength,后续消息体通过底层方法 Send() / SendPackets() 发送
  1988. * ullBodyLen < iLength -> 错误参数,发送失败
  1989. * 返回值: TRUE -- 成功
  1990. * FALSE -- 失败
  1991. */
  1992. virtual BOOL SendWSMessage(BOOL bFinal, BYTE iReserved, BYTE iOperationCode, const BYTE lpszMask[4], const BYTE* pData = nullptr, int iLength = 0, ULONGLONG ullBodyLen = 0) = 0;
  1993. /*
  1994. * 名称:启动 HTTP 通信
  1995. * 描述:当通信组件设置为非自动启动 HTTP 通信时,需要调用本方法启动 HTTP 通信
  1996. *
  1997. * 返回值: TRUE -- 成功
  1998. * FALSE -- 失败,可通过 SYS_GetLastError() 获取失败原因
  1999. */
  2000. virtual BOOL StartHttp() = 0;
  2001. /*
  2002. * 名称:发送 Chunked 数据分片
  2003. * 描述:向对端发送 Chunked 数据分片
  2004. *
  2005. * 参数: pData -- Chunked 数据分片
  2006. * iLength -- 数据分片长度(为 0 表示结束分片)
  2007. * lpszExtensions -- 扩展属性(默认:nullptr)
  2008. * 返回值: TRUE -- 成功
  2009. * FALSE -- 失败
  2010. */
  2011. virtual BOOL SendChunkData(const BYTE* pData = nullptr, int iLength = 0, LPCSTR lpszExtensions = nullptr) = 0;
  2012. public:
  2013. /***********************************************************************/
  2014. /***************************** 属性访问方法 *****************************/
  2015. /* 设置本地协议版本 */
  2016. virtual void SetLocalVersion(EnHttpVersion usVersion) = 0;
  2017. /* 获取本地协议版本 */
  2018. virtual EnHttpVersion GetLocalVersion() = 0;
  2019. /* 检查是否升级协议 */
  2020. virtual BOOL IsUpgrade() = 0;
  2021. /* 检查是否有 Keep-Alive 标识 */
  2022. virtual BOOL IsKeepAlive() = 0;
  2023. /* 获取协议版本 */
  2024. virtual USHORT GetVersion() = 0;
  2025. /* 获取内容长度 */
  2026. virtual ULONGLONG GetContentLength() = 0;
  2027. /* 获取内容类型 */
  2028. virtual LPCSTR GetContentType() = 0;
  2029. /* 获取内容编码 */
  2030. virtual LPCSTR GetContentEncoding() = 0;
  2031. /* 获取传输编码 */
  2032. virtual LPCSTR GetTransferEncoding() = 0;
  2033. /* 获取协议升级类型 */
  2034. virtual EnHttpUpgradeType GetUpgradeType() = 0;
  2035. /* 获取解析错误代码 */
  2036. virtual USHORT GetParseErrorCode(LPCSTR* lpszErrorDesc = nullptr) = 0;
  2037. /* 获取 HTTP 状态码 */
  2038. virtual USHORT GetStatusCode() = 0;
  2039. /* 获取某个请求头(单值) */
  2040. virtual BOOL GetHeader(LPCSTR lpszName, LPCSTR* lpszValue) = 0;
  2041. /* 获取某个请求头(多值) */
  2042. virtual BOOL GetHeaders(LPCSTR lpszName, LPCSTR lpszValue[], DWORD& dwCount) = 0;
  2043. /* 获取所有请求头 */
  2044. virtual BOOL GetAllHeaders(THeader lpHeaders[], DWORD& dwCount) = 0;
  2045. /* 获取所有请求头名称 */
  2046. virtual BOOL GetAllHeaderNames(LPCSTR lpszName[], DWORD& dwCount) = 0;
  2047. /* 获取 Cookie */
  2048. virtual BOOL GetCookie(LPCSTR lpszName, LPCSTR* lpszValue) = 0;
  2049. /* 获取所有 Cookie */
  2050. virtual BOOL GetAllCookies(TCookie lpCookies[], DWORD& dwCount) = 0;
  2051. /*
  2052. // !! maybe implemented in future !! //
  2053. virtual BOOL GetParam(LPCSTR lpszName, LPCSTR* lpszValue) = 0;
  2054. virtual BOOL GetParams(LPCSTR lpszName, LPCSTR lpszValue[], DWORD& dwCount) = 0;
  2055. virtual BOOL GetAllParams(LPPARAM lpszParam[], DWORD& dwCount) = 0;
  2056. virtual BOOL GetAllParamNames(LPCSTR lpszName[], DWORD& dwCount) = 0;
  2057. */
  2058. /* 获取当前 WebSocket 消息状态,传入 nullptr 则不获取相应字段 */
  2059. virtual BOOL GetWSMessageState(BOOL* lpbFinal, BYTE* lpiReserved, BYTE* lpiOperationCode, LPCBYTE* lpszMask, ULONGLONG* lpullBodyLen, ULONGLONG* lpullBodyRemain) = 0;
  2060. /* 设置 HTTP 启动方式(默认:TRUE,自动启动) */
  2061. virtual void SetHttpAutoStart(BOOL bAutoStart) = 0;
  2062. /* 获取 HTTP 启动方式 */
  2063. virtual BOOL IsHttpAutoStart() = 0;
  2064. public:
  2065. virtual ~IHttp() {}
  2066. };
  2067. /************************************************************************
  2068. 名称:简单 Http 请求者组件接口
  2069. 描述:定义简单 Http 请求者组件的所有操作方法和属性访问方法
  2070. ************************************************************************/
  2071. class IHttpRequester : public IHttp
  2072. {
  2073. public:
  2074. /***********************************************************************/
  2075. /***************************** 组件操作方法 *****************************/
  2076. /*
  2077. * 名称:发送请求
  2078. * 描述:向服务端发送 HTTP 请求
  2079. *
  2080. * 参数: lpszMethod -- 请求方法
  2081. * lpszPath -- 请求路径
  2082. * lpHeaders -- 请求头
  2083. * iHeaderCount -- 请求头数量
  2084. * pBody -- 请求体
  2085. * iLength -- 请求体长度
  2086. * 返回值: TRUE -- 成功
  2087. * FALSE -- 失败
  2088. */
  2089. virtual BOOL SendRequest(LPCSTR lpszMethod, LPCSTR lpszPath, const THeader lpHeaders[] = nullptr, int iHeaderCount = 0, const BYTE* pBody = nullptr, int iLength = 0) = 0;
  2090. /*
  2091. * 名称:发送本地文件
  2092. * 描述:向指定连接发送 4096 KB 以下的小文件
  2093. *
  2094. * 参数: dwConnID -- 连接 ID
  2095. * lpszFileName -- 文件路径
  2096. * lpszMethod -- 请求方法
  2097. * lpszPath -- 请求路径
  2098. * lpHeaders -- 请求头
  2099. * iHeaderCount -- 请求头数量
  2100. * 返回值: TRUE -- 成功
  2101. * FALSE -- 失败
  2102. */
  2103. virtual BOOL SendLocalFile(LPCSTR lpszFileName, LPCSTR lpszMethod, LPCSTR lpszPath, const THeader lpHeaders[] = nullptr, int iHeaderCount = 0) = 0;
  2104. /* 发送 POST 请求 */
  2105. virtual BOOL SendPost(LPCSTR lpszPath, const THeader lpHeaders[], int iHeaderCount, const BYTE* pBody, int iLength) = 0;
  2106. /* 发送 PUT 请求 */
  2107. virtual BOOL SendPut(LPCSTR lpszPath, const THeader lpHeaders[], int iHeaderCount, const BYTE* pBody, int iLength) = 0;
  2108. /* 发送 PATCH 请求 */
  2109. virtual BOOL SendPatch(LPCSTR lpszPath, const THeader lpHeaders[], int iHeaderCount, const BYTE* pBody, int iLength) = 0;
  2110. /* 发送 GET 请求 */
  2111. virtual BOOL SendGet(LPCSTR lpszPath, const THeader lpHeaders[] = nullptr, int iHeaderCount = 0) = 0;
  2112. /* 发送 DELETE 请求 */
  2113. virtual BOOL SendDelete(LPCSTR lpszPath, const THeader lpHeaders[] = nullptr, int iHeaderCount = 0) = 0;
  2114. /* 发送 HEAD 请求 */
  2115. virtual BOOL SendHead(LPCSTR lpszPath, const THeader lpHeaders[] = nullptr, int iHeaderCount = 0) = 0;
  2116. /* 发送 TRACE 请求 */
  2117. virtual BOOL SendTrace(LPCSTR lpszPath, const THeader lpHeaders[] = nullptr, int iHeaderCount = 0) = 0;
  2118. /* 发送 OPTIONS 请求 */
  2119. virtual BOOL SendOptions(LPCSTR lpszPath, const THeader lpHeaders[] = nullptr, int iHeaderCount = 0) = 0;
  2120. /* 发送 CONNECT 请求 */
  2121. virtual BOOL SendConnect(LPCSTR lpszHost, const THeader lpHeaders[] = nullptr, int iHeaderCount = 0) = 0;
  2122. public:
  2123. /***********************************************************************/
  2124. /***************************** 属性访问方法 *****************************/
  2125. /* 设置是否使用 Cookie(默认:TRUE) */
  2126. virtual void SetUseCookie(BOOL bUseCookie) = 0;
  2127. /* 检查是否使用 Cookie */
  2128. virtual BOOL IsUseCookie() = 0;
  2129. };
  2130. /************************************************************************
  2131. 名称:简单 Http 同步请求者组件接口
  2132. 描述:定义简单 Http 同步请求者组件的所有操作方法和属性访问方法
  2133. ************************************************************************/
  2134. class IHttpSyncRequester : public IHttpRequester
  2135. {
  2136. public:
  2137. /*
  2138. * 名称:发送 URL 请求
  2139. * 描述:向服务端发送 HTTP URL 请求
  2140. *
  2141. * 参数: lpszMethod -- 请求方法
  2142. * lpszUrl -- 请求 URL
  2143. * lpHeaders -- 请求头
  2144. * iHeaderCount -- 请求头数量
  2145. * pBody -- 请求体
  2146. * iLength -- 请求体长度
  2147. * bForceReconnect -- 强制重新连接(默认:FALSE,当请求 URL 的主机和端口与现有连接一致时,重用现有连接)
  2148. * 返回值: TRUE -- 成功
  2149. * FALSE -- 失败
  2150. */
  2151. virtual BOOL OpenUrl(LPCSTR lpszMethod, LPCSTR lpszUrl, const THeader lpHeaders[] = nullptr, int iHeaderCount = 0, const BYTE* pBody = nullptr, int iLength = 0, BOOL bForceReconnect = FALSE) = 0;
  2152. /***********************************************************************/
  2153. /***************************** 组件操作方法 *****************************/
  2154. /*
  2155. * 名称:清除请求结果
  2156. * 描述:清除上一次请求的响应头和响应体等结果信息(该方法会在每次发送请求前自动调用)
  2157. *
  2158. * 参数:
  2159. * 返回值: TRUE -- 成功
  2160. * FALSE -- 失败
  2161. */
  2162. virtual BOOL CleanupRequestResult () = 0;
  2163. public:
  2164. /***********************************************************************/
  2165. /***************************** 属性访问方法 *****************************/
  2166. /* 设置连接超时(毫秒,0:系统默认超时,默认:5000) */
  2167. virtual void SetConnectTimeout (DWORD dwConnectTimeout) = 0;
  2168. /* 设置请求超时(毫秒,0:无限等待,默认:10000) */
  2169. virtual void SetRequestTimeout (DWORD dwRequestTimeout) = 0;
  2170. /* 获取连接超时 */
  2171. virtual DWORD GetConnectTimeout () = 0;
  2172. /* 获取请求超时 */
  2173. virtual DWORD GetRequestTimeout () = 0;
  2174. /* 获取响应体 */
  2175. virtual BOOL GetResponseBody (LPCBYTE* lpszBody, int* iLength) = 0;
  2176. };
  2177. /************************************************************************
  2178. 名称:HTTP 组件接口
  2179. 描述:继承了 HTTP 和 Socket 接口
  2180. ************************************************************************/
  2181. typedef DualInterface<IComplexHttpResponder, ITcpServer> IHttpServer;
  2182. typedef DualInterface<IComplexHttpRequester, ITcpAgent> IHttpAgent;
  2183. typedef DualInterface<IHttpRequester, ITcpClient> IHttpClient;
  2184. typedef DualInterface<IHttpSyncRequester, ITcpClient> IHttpSyncClient;
  2185. /************************************************************************
  2186. 名称:IComplexHttp 组件监听器基接口
  2187. 描述:定义 IComplexHttp 组件监听器的所有事件
  2188. ************************************************************************/
  2189. template<class T> class IHttpListenerT
  2190. {
  2191. public:
  2192. /*
  2193. * 名称:开始解析通知
  2194. * 描述:开始解析 HTTP 报文时,向监听器发送该通知
  2195. *
  2196. * 参数: pSender -- 事件源对象
  2197. * dwConnID -- 连接 ID
  2198. * 返回值: HPR_OK -- 继续执行
  2199. * HPR_ERROR -- 引发 OnParserError() 和 OnClose() 事件并关闭连接
  2200. */
  2201. virtual EnHttpParseResult OnMessageBegin(T* pSender, CONNID dwConnID) = 0;
  2202. /*
  2203. * 名称:请求行解析完成通知(仅用于 HTTP 服务端)
  2204. * 描述:请求行解析完成后,向监听器发送该通知
  2205. *
  2206. * 参数: pSender -- 事件源对象
  2207. * dwConnID -- 连接 ID
  2208. * lpszMethod -- 请求方法名
  2209. * lpszUrl -- 请求行中的 URL 域
  2210. * 返回值: HPR_OK -- 继续执行
  2211. * HPR_ERROR -- 引发 OnParserError() 和 OnClose() 事件并关闭连接
  2212. */
  2213. virtual EnHttpParseResult OnRequestLine(T* pSender, CONNID dwConnID, LPCSTR lpszMethod, LPCSTR lpszUrl) = 0;
  2214. /*
  2215. * 名称:状态行解析完成通知(仅用于 HTTP 客户端)
  2216. * 描述:状态行解析完成后,向监听器发送该通知
  2217. *
  2218. * 参数: pSender -- 事件源对象
  2219. * dwConnID -- 连接 ID
  2220. * usStatusCode -- HTTP 状态码
  2221. * lpszDesc -- 状态描述
  2222. * 返回值: HPR_OK -- 继续执行
  2223. * HPR_ERROR -- 引发 OnParserError() 和 OnClose() 事件并关闭连接
  2224. */
  2225. virtual EnHttpParseResult OnStatusLine(T* pSender, CONNID dwConnID, USHORT usStatusCode, LPCSTR lpszDesc) = 0;
  2226. /*
  2227. * 名称:请求头通知
  2228. * 描述:每当解析完成一个请求头后,向监听器发送该通知
  2229. *
  2230. * 参数: pSender -- 事件源对象
  2231. * dwConnID -- 连接 ID
  2232. * lpszName -- 请求头名称
  2233. * lpszValue -- 请求头值
  2234. * 返回值: HPR_OK -- 继续执行
  2235. * HPR_ERROR -- 引发 OnParserError() 和 OnClose() 事件并关闭连接
  2236. */
  2237. virtual EnHttpParseResult OnHeader(T* pSender, CONNID dwConnID, LPCSTR lpszName, LPCSTR lpszValue) = 0;
  2238. /*
  2239. * 名称:请求头完成通知
  2240. * 描述:解析完成所有请求头后,向监听器发送该通知
  2241. *
  2242. * 参数: pSender -- 事件源对象
  2243. * dwConnID -- 连接 ID
  2244. * 返回值: HPR_OK -- 继续执行
  2245. * HPR_SKIP_BODY -- 跳过当前请求的 HTTP BODY
  2246. * HPR_UPGRADE -- 升级协议
  2247. * HPR_ERROR -- 引发 OnParserError() 和 OnClose() 事件并关闭连接
  2248. */
  2249. virtual EnHttpParseResult OnHeadersComplete(T* pSender, CONNID dwConnID) = 0;
  2250. /*
  2251. * 名称:BODY 报文通知
  2252. * 描述:每当接收到 HTTP BODY 报文,向监听器发送该通知
  2253. *
  2254. * 参数: pSender -- 事件源对象
  2255. * dwConnID -- 连接 ID
  2256. * pData -- 数据缓冲区
  2257. * iLength -- 数据长度
  2258. * 返回值: HPR_OK -- 继续执行
  2259. * HPR_ERROR -- 引发 OnParserError() 和 OnClose() 事件并关闭连接
  2260. */
  2261. virtual EnHttpParseResult OnBody(T* pSender, CONNID dwConnID, const BYTE* pData, int iLength) = 0;
  2262. /*
  2263. * 名称:Chunked 报文头通知
  2264. * 描述:每当解析出一个 Chunked 报文头,向监听器发送该通知
  2265. *
  2266. * 参数: pSender -- 事件源对象
  2267. * dwConnID -- 连接 ID
  2268. * iLength -- Chunked 报文体数据长度
  2269. * 返回值: HPR_OK -- 继续执行
  2270. * HPR_ERROR -- 引发 OnParserError() 和 OnClose() 事件并关闭连接
  2271. */
  2272. virtual EnHttpParseResult OnChunkHeader(T* pSender, CONNID dwConnID, int iLength) = 0;
  2273. /*
  2274. * 名称:Chunked 报文结束通知
  2275. * 描述:每当解析完一个 Chunked 报文,向监听器发送该通知
  2276. *
  2277. * 参数: pSender -- 事件源对象
  2278. * dwConnID -- 连接 ID
  2279. * 返回值: HPR_OK -- 继续执行
  2280. * HPR_ERROR -- 引发 OnParserError() 和 OnClose() 事件并关闭连接
  2281. */
  2282. virtual EnHttpParseResult OnChunkComplete(T* pSender, CONNID dwConnID) = 0;
  2283. /*
  2284. * 名称:完成解析通知
  2285. * 描述:每当解析完成一个完整 HTTP 报文,向监听器发送该通知
  2286. *
  2287. * 参数: pSender -- 事件源对象
  2288. * dwConnID -- 连接 ID
  2289. * 返回值: HPR_OK -- 继续执行
  2290. * HPR_ERROR -- 引发 OnParserError() 和 OnClose() 事件并关闭连接
  2291. */
  2292. virtual EnHttpParseResult OnMessageComplete(T* pSender, CONNID dwConnID) = 0;
  2293. /*
  2294. * 名称:升级协议通知
  2295. * 描述:当需要升级协议时,向监听器发送该通知
  2296. *
  2297. * 参数: pSender -- 事件源对象
  2298. * dwConnID -- 连接 ID
  2299. * enUpgradeType -- 协议类型
  2300. * 返回值: HPR_OK -- 继续执行
  2301. * HPR_ERROR -- 引发 OnClose() 事件并关闭连接
  2302. */
  2303. virtual EnHttpParseResult OnUpgrade(T* pSender, CONNID dwConnID, EnHttpUpgradeType enUpgradeType) = 0;
  2304. /*
  2305. * 名称:解析错误通知
  2306. * 描述:当解析 HTTP 报文错误时,向监听器发送该通知
  2307. *
  2308. * 参数: pSender -- 事件源对象
  2309. * dwConnID -- 连接 ID
  2310. * iErrorCode -- 错误代码
  2311. * lpszErrorDesc -- 错误描述
  2312. * 返回值: HPR_OK -- 继续执行
  2313. * HPR_ERROR -- 引发 OnClose() 事件并关闭连接
  2314. */
  2315. virtual EnHttpParseResult OnParseError(T* pSender, CONNID dwConnID, int iErrorCode, LPCSTR lpszErrorDesc) = 0;
  2316. /*
  2317. * 名称:WebSocket 数据包头通知
  2318. * 描述:当解析 WebSocket 数据包头时,向监听器发送该通知
  2319. *
  2320. * 参数: pSender -- 事件源对象
  2321. * dwConnID -- 连接 ID
  2322. * bFinal -- 是否结束帧
  2323. * iReserved -- RSV1/RSV2/RSV3 各 1 位
  2324. * iOperationCode -- 操作码:0x0 - 0xF
  2325. * lpszMask -- 掩码(nullptr 或 4 字节掩码,如果为 nullptr 则没有掩码)
  2326. * ullBodyLen -- 消息体长度
  2327. * 返回值: HR_OK / HR_IGNORE -- 继续执行
  2328. * HR_ERROR -- 引发 OnClose() 事件并关闭连接
  2329. */
  2330. virtual EnHandleResult OnWSMessageHeader(T* pSender, CONNID dwConnID, BOOL bFinal, BYTE iReserved, BYTE iOperationCode, const BYTE lpszMask[4], ULONGLONG ullBodyLen) = 0;
  2331. /*
  2332. * 名称:WebSocket 数据包体通知
  2333. * 描述:当接收到 WebSocket 数据包体时,向监听器发送该通知
  2334. *
  2335. * 参数: pSender -- 事件源对象
  2336. * dwConnID -- 连接 ID
  2337. * pData -- 消息体数据缓冲区
  2338. * iLength -- 消息体数据长度
  2339. * 返回值: HR_OK / HR_IGNORE -- 继续执行
  2340. * HR_ERROR -- 引发 OnClose() 事件并关闭连接
  2341. */
  2342. virtual EnHandleResult OnWSMessageBody(T* pSender, CONNID dwConnID, const BYTE* pData, int iLength) = 0;
  2343. /*
  2344. * 名称:WebSocket 数据包完成通知
  2345. * 描述:当完整接收一个 WebSocket 数据包时,向监听器发送该通知
  2346. *
  2347. * 参数: pSender -- 事件源对象
  2348. * dwConnID -- 连接 ID
  2349. * 返回值: HR_OK / HR_IGNORE -- 继续执行
  2350. * HR_ERROR -- 引发 OnClose() 事件并关闭连接
  2351. */
  2352. virtual EnHandleResult OnWSMessageComplete(T* pSender, CONNID dwConnID) = 0;
  2353. public:
  2354. virtual ~IHttpListenerT() {}
  2355. };
  2356. /************************************************************************
  2357. 名称:IHttpServer 组件端监听器接口
  2358. 描述:定义 IHttpServer 监听器的所有事件
  2359. ************************************************************************/
  2360. class IHttpServerListener : public IHttpListenerT<IHttpServer>, public ITcpServerListener
  2361. {
  2362. public:
  2363. };
  2364. /************************************************************************
  2365. 名称:IHttpAgent 组件端监听器接口
  2366. 描述:定义 IHttpAgent 监听器的所有事件
  2367. ************************************************************************/
  2368. class IHttpAgentListener : public IHttpListenerT<IHttpAgent>, public ITcpAgentListener
  2369. {
  2370. public:
  2371. };
  2372. /************************************************************************
  2373. 名称:IHttpClient 组件端监听器接口
  2374. 描述:定义 IHttpClient 监听器的所有事件
  2375. ************************************************************************/
  2376. class IHttpClientListener : public IHttpListenerT<IHttpClient>, public ITcpClientListener
  2377. {
  2378. public:
  2379. };
  2380. /************************************************************************
  2381. 名称:IHttpServerListener 监听器抽象基类
  2382. 描述:定义某些事件的默认处理方法(忽略事件)
  2383. ************************************************************************/
  2384. class CHttpServerListener : public IHttpServerListener
  2385. {
  2386. public:
  2387. virtual EnHandleResult OnPrepareListen(ITcpServer* pSender, SOCKET soListen) {return HR_IGNORE;}
  2388. virtual EnHandleResult OnAccept(ITcpServer* pSender, CONNID dwConnID, UINT_PTR soClient) {return HR_IGNORE;}
  2389. virtual EnHandleResult OnHandShake(ITcpServer* pSender, CONNID dwConnID) {return HR_IGNORE;}
  2390. virtual EnHandleResult OnReceive(ITcpServer* pSender, CONNID dwConnID, int iLength) {return HR_IGNORE;}
  2391. virtual EnHandleResult OnReceive(ITcpServer* pSender, CONNID dwConnID, const BYTE* pData, int iLength) {return HR_IGNORE;}
  2392. virtual EnHandleResult OnSend(ITcpServer* pSender, CONNID dwConnID, const BYTE* pData, int iLength) {return HR_IGNORE;}
  2393. virtual EnHandleResult OnShutdown(ITcpServer* pSender) {return HR_IGNORE;}
  2394. virtual EnHttpParseResult OnMessageBegin(IHttpServer* pSender, CONNID dwConnID) {return HPR_OK;}
  2395. virtual EnHttpParseResult OnRequestLine(IHttpServer* pSender, CONNID dwConnID, LPCSTR lpszMethod, LPCSTR lpszUrl) {return HPR_OK;}
  2396. virtual EnHttpParseResult OnStatusLine(IHttpServer* pSender, CONNID dwConnID, USHORT usStatusCode, LPCSTR lpszDesc) {return HPR_OK;}
  2397. virtual EnHttpParseResult OnHeader(IHttpServer* pSender, CONNID dwConnID, LPCSTR lpszName, LPCSTR lpszValue) {return HPR_OK;}
  2398. virtual EnHttpParseResult OnChunkHeader(IHttpServer* pSender, CONNID dwConnID, int iLength) {return HPR_OK;}
  2399. virtual EnHttpParseResult OnChunkComplete(IHttpServer* pSender, CONNID dwConnID) {return HPR_OK;}
  2400. virtual EnHttpParseResult OnUpgrade(IHttpServer* pSender, CONNID dwConnID, EnHttpUpgradeType enUpgradeType) {return HPR_OK;}
  2401. virtual EnHandleResult OnWSMessageHeader(IHttpServer* pSender, CONNID dwConnID, BOOL bFinal, BYTE iReserved, BYTE iOperationCode, const BYTE lpszMask[4], ULONGLONG ullBodyLen) {return HR_IGNORE;}
  2402. virtual EnHandleResult OnWSMessageBody(IHttpServer* pSender, CONNID dwConnID, const BYTE* pData, int iLength) {return HR_IGNORE;}
  2403. virtual EnHandleResult OnWSMessageComplete(IHttpServer* pSender, CONNID dwConnID) {return HR_IGNORE;}
  2404. };
  2405. /************************************************************************
  2406. 名称:IHttpAgentListener 监听器抽象基类
  2407. 描述:定义某些事件的默认处理方法(忽略事件)
  2408. ************************************************************************/
  2409. class CHttpAgentListener : public IHttpAgentListener
  2410. {
  2411. public:
  2412. virtual EnHandleResult OnPrepareConnect(ITcpAgent* pSender, CONNID dwConnID, SOCKET socket) {return HR_IGNORE;}
  2413. virtual EnHandleResult OnConnect(ITcpAgent* pSender, CONNID dwConnID) {return HR_IGNORE;}
  2414. virtual EnHandleResult OnHandShake(ITcpAgent* pSender, CONNID dwConnID) {return HR_IGNORE;}
  2415. virtual EnHandleResult OnReceive(ITcpAgent* pSender, CONNID dwConnID, int iLength) {return HR_IGNORE;}
  2416. virtual EnHandleResult OnReceive(ITcpAgent* pSender, CONNID dwConnID, const BYTE* pData, int iLength) {return HR_IGNORE;}
  2417. virtual EnHandleResult OnSend(ITcpAgent* pSender, CONNID dwConnID, const BYTE* pData, int iLength) {return HR_IGNORE;}
  2418. virtual EnHandleResult OnShutdown(ITcpAgent* pSender) {return HR_IGNORE;}
  2419. virtual EnHttpParseResult OnMessageBegin(IHttpAgent* pSender, CONNID dwConnID) {return HPR_OK;}
  2420. virtual EnHttpParseResult OnRequestLine(IHttpAgent* pSender, CONNID dwConnID, LPCSTR lpszMethod, LPCSTR lpszUrl) {return HPR_OK;}
  2421. virtual EnHttpParseResult OnStatusLine(IHttpAgent* pSender, CONNID dwConnID, USHORT usStatusCode, LPCSTR lpszDesc) {return HPR_OK;}
  2422. virtual EnHttpParseResult OnHeader(IHttpAgent* pSender, CONNID dwConnID, LPCSTR lpszName, LPCSTR lpszValue) {return HPR_OK;}
  2423. virtual EnHttpParseResult OnChunkHeader(IHttpAgent* pSender, CONNID dwConnID, int iLength) {return HPR_OK;}
  2424. virtual EnHttpParseResult OnChunkComplete(IHttpAgent* pSender, CONNID dwConnID) {return HPR_OK;}
  2425. virtual EnHttpParseResult OnUpgrade(IHttpAgent* pSender, CONNID dwConnID, EnHttpUpgradeType enUpgradeType) {return HPR_OK;}
  2426. virtual EnHandleResult OnWSMessageHeader(IHttpAgent* pSender, CONNID dwConnID, BOOL bFinal, BYTE iReserved, BYTE iOperationCode, const BYTE lpszMask[4], ULONGLONG ullBodyLen) {return HR_IGNORE;}
  2427. virtual EnHandleResult OnWSMessageBody(IHttpAgent* pSender, CONNID dwConnID, const BYTE* pData, int iLength) {return HR_IGNORE;}
  2428. virtual EnHandleResult OnWSMessageComplete(IHttpAgent* pSender, CONNID dwConnID) {return HR_IGNORE;}
  2429. };
  2430. /************************************************************************
  2431. 名称:IHttpClientListener 监听器抽象基类
  2432. 描述:定义某些事件的默认处理方法(忽略事件)
  2433. ************************************************************************/
  2434. class CHttpClientListener : public IHttpClientListener
  2435. {
  2436. public:
  2437. virtual EnHandleResult OnPrepareConnect(ITcpClient* pSender, CONNID dwConnID, SOCKET socket) {return HR_IGNORE;}
  2438. virtual EnHandleResult OnConnect(ITcpClient* pSender, CONNID dwConnID) {return HR_IGNORE;}
  2439. virtual EnHandleResult OnHandShake(ITcpClient* pSender, CONNID dwConnID) {return HR_IGNORE;}
  2440. virtual EnHandleResult OnReceive(ITcpClient* pSender, CONNID dwConnID, int iLength) {return HR_IGNORE;}
  2441. virtual EnHandleResult OnReceive(ITcpClient* pSender, CONNID dwConnID, const BYTE* pData, int iLength) {return HR_IGNORE;}
  2442. virtual EnHandleResult OnSend(ITcpClient* pSender, CONNID dwConnID, const BYTE* pData, int iLength) {return HR_IGNORE;}
  2443. virtual EnHttpParseResult OnMessageBegin(IHttpClient* pSender, CONNID dwConnID) {return HPR_OK;}
  2444. virtual EnHttpParseResult OnRequestLine(IHttpClient* pSender, CONNID dwConnID, LPCSTR lpszMethod, LPCSTR lpszUrl) {return HPR_OK;}
  2445. virtual EnHttpParseResult OnStatusLine(IHttpClient* pSender, CONNID dwConnID, USHORT usStatusCode, LPCSTR lpszDesc) {return HPR_OK;}
  2446. virtual EnHttpParseResult OnHeader(IHttpClient* pSender, CONNID dwConnID, LPCSTR lpszName, LPCSTR lpszValue) {return HPR_OK;}
  2447. virtual EnHttpParseResult OnChunkHeader(IHttpClient* pSender, CONNID dwConnID, int iLength) {return HPR_OK;}
  2448. virtual EnHttpParseResult OnChunkComplete(IHttpClient* pSender, CONNID dwConnID) {return HPR_OK;}
  2449. virtual EnHttpParseResult OnUpgrade(IHttpClient* pSender, CONNID dwConnID, EnHttpUpgradeType enUpgradeType) {return HPR_OK;}
  2450. virtual EnHandleResult OnWSMessageHeader(IHttpClient* pSender, CONNID dwConnID, BOOL bFinal, BYTE iReserved, BYTE iOperationCode, const BYTE lpszMask[4], ULONGLONG ullBodyLen) {return HR_IGNORE;}
  2451. virtual EnHandleResult OnWSMessageBody(IHttpClient* pSender, CONNID dwConnID, const BYTE* pData, int iLength) {return HR_IGNORE;}
  2452. virtual EnHandleResult OnWSMessageComplete(IHttpClient* pSender, CONNID dwConnID) {return HR_IGNORE;}
  2453. };
  2454. /************************************************************************
  2455. 名称:IHttpClientListener 监听器抽象基类
  2456. 描述:定义某些事件的默认处理方法(忽略事件)
  2457. ************************************************************************/
  2458. class CHttpSyncClientListener : public CHttpClientListener
  2459. {
  2460. public:
  2461. virtual EnHandleResult OnClose(ITcpClient* pSender, CONNID dwConnID, EnSocketOperation enOperation, int iErrorCode) {return HR_IGNORE;}
  2462. virtual EnHttpParseResult OnHeadersComplete(IHttpClient* pSender, CONNID dwConnID) {return HPR_OK;}
  2463. virtual EnHttpParseResult OnBody(IHttpClient* pSender, CONNID dwConnID, const BYTE* pData, int iLength) {return HPR_OK;}
  2464. virtual EnHttpParseResult OnMessageComplete(IHttpClient* pSender, CONNID dwConnID) {return HPR_OK;}
  2465. virtual EnHttpParseResult OnParseError(IHttpClient* pSender, CONNID dwConnID, int iErrorCode, LPCSTR lpszErrorDesc) {return HPR_OK;}
  2466. };
  2467. #endif
  2468. /*****************************************************************************************************************************************************/
  2469. /************************************************************** Thread Pool Interfaces ***************************************************************/
  2470. /*****************************************************************************************************************************************************/
  2471. /************************************************************************
  2472. 名称:线程池组件接口
  2473. 描述:定义线程池组件的所有操作方法和属性访问方法
  2474. ************************************************************************/
  2475. class IHPThreadPool
  2476. {
  2477. public:
  2478. /***********************************************************************/
  2479. /***************************** 组件操作方法 *****************************/
  2480. /*
  2481. * 名称:启动线程池组件
  2482. * 描述:
  2483. *
  2484. * 参数: dwThreadCount -- 线程数量,(默认:0)
  2485. * >0 -> dwThreadCount
  2486. * =0 -> (CPU核数 * 2 + 2)
  2487. * <0 -> (CPU核数 * (-dwThreadCount))
  2488. * dwMaxQueueSize -- 任务队列最大容量(默认:0,不限制)
  2489. * enRejectedPolicy -- 任务拒绝处理策略
  2490. * TRP_CALL_FAIL(默认) :立刻返回失败
  2491. * TRP_WAIT_FOR :等待(直到成功、超时或线程池关闭等原因导致失败)
  2492. * TRP_CALLER_RUN :调用者线程直接执行
  2493. * dwStackSize -- 线程堆栈空间大小(默认:0 -> 操作系统默认)
  2494. * 返回值: TRUE -- 成功
  2495. * FALSE -- 失败,可通过 SYS_GetLastError() 获取错误代码
  2496. */
  2497. virtual BOOL Start (DWORD dwThreadCount = 0, DWORD dwMaxQueueSize = 0, EnRejectedPolicy enRejectedPolicy = TRP_CALL_FAIL, DWORD dwStackSize = 0) = 0;
  2498. /*
  2499. * 名称:关闭线程池组件
  2500. * 描述:在规定时间内关闭线程池组件,如果工作线程在最大等待时间内未能正常关闭,会尝试强制关闭,这种情况下很可能会造成系统资源泄漏
  2501. *
  2502. * 参数: dwMaxWait -- 最大等待时间(毫秒,默认:INFINITE,一直等待)
  2503. * 返回值: TRUE -- 成功
  2504. * FALSE -- 失败,可通过 SYS_GetLastError() 获取错误代码
  2505. */
  2506. virtual BOOL Stop (DWORD dwMaxWait = INFINITE) = 0;
  2507. /*
  2508. * 名称:提交任务
  2509. * 描述:向线程池提交异步任务
  2510. *
  2511. * 参数: fnTaskProc -- 任务处理函数
  2512. * pvArg -- 任务参数
  2513. * dwMaxWait -- 任务提交最大等待时间(仅对 TRP_WAIT_FOR 类型线程池生效,默认:INFINITE,一直等待)
  2514. * 返回值: TRUE -- 成功
  2515. * FALSE -- 失败,可通过 SYS_GetLastError() 获取错误代码
  2516. * 其中,错误码 ERROR_DESTINATION_ELEMENT_FULL 表示任务队列已满
  2517. */
  2518. virtual BOOL Submit (Fn_TaskProc fnTaskProc, PVOID pvArg, DWORD dwMaxWait = INFINITE) = 0;
  2519. /*
  2520. * 名称:提交 Socket 任务
  2521. * 描述:向线程池提交异步 Socket 任务
  2522. *
  2523. * 参数: pTask -- 任务参数
  2524. * dwMaxWait -- 任务提交最大等待时间(仅对 TRP_WAIT_FOR 类型线程池生效,默认:INFINITE,一直等待)
  2525. * 返回值: TRUE -- 成功
  2526. * FALSE -- 失败,可通过 SYS_GetLastError() 获取错误代码
  2527. * 其中,错误码 ERROR_DESTINATION_ELEMENT_FULL 表示任务队列已满
  2528. * 注意:如果提交失败,需要手工调用 Destroy_HP_SocketTaskObj() 销毁 TSocketTask 对象
  2529. */
  2530. virtual BOOL Submit (LPTSocketTask pTask, DWORD dwMaxWait = INFINITE) = 0;
  2531. /*
  2532. * 名称:调整线程池大小
  2533. * 描述:增加或减少线程池的工作线程数量
  2534. *
  2535. * 参数: dwNewThreadCount -- 线程数量
  2536. * >0 -> dwNewThreadCount
  2537. * =0 -> (CPU核数 * 2 + 2)
  2538. * <0 -> (CPU核数 * (-dwNewThreadCount))
  2539. * 返回值: TRUE -- 成功
  2540. * FALSE -- 失败,可通过 SYS_GetLastError() 获取错误代码
  2541. */
  2542. virtual BOOL AdjustThreadCount(DWORD dwNewThreadCount) = 0;
  2543. /*
  2544. * 名称:等待
  2545. * 描述:等待线程池组件停止运行
  2546. *
  2547. * 参数: dwMilliseconds -- 超时时间(毫秒,默认:-1,永不超时)
  2548. * 返回值: TRUE -- 成功
  2549. * FALSE -- 失败,可通过 SYS_GetLastError() 获取错误代码
  2550. */
  2551. virtual BOOL Wait(DWORD dwMilliseconds = INFINITE) = 0;
  2552. public:
  2553. /***********************************************************************/
  2554. /***************************** 属性访问方法 *****************************/
  2555. /* 检查线程池组件是否已启动 */
  2556. virtual BOOL HasStarted () = 0;
  2557. /* 查看线程池组件当前状态 */
  2558. virtual EnServiceState GetState () = 0;
  2559. /* 获取当前任务等待队列大小 */
  2560. virtual DWORD GetQueueSize () = 0;
  2561. /* 获取当前正在执行的任务数量 */
  2562. virtual DWORD GetTaskCount () = 0;
  2563. /* 获取工作线程数量 */
  2564. virtual DWORD GetThreadCount () = 0;
  2565. /* 获取任务队列最大容量 */
  2566. virtual DWORD GetMaxQueueSize () = 0;
  2567. /* 获取任务拒绝处理策略 */
  2568. virtual EnRejectedPolicy GetRejectedPolicy () = 0;
  2569. public:
  2570. virtual ~IHPThreadPool() {};
  2571. };
  2572. /************************************************************************
  2573. 名称:线程池监听器接口
  2574. 描述:定义线程池监听器的所有事件
  2575. ************************************************************************/
  2576. class IHPThreadPoolListener
  2577. {
  2578. public:
  2579. /*
  2580. * 名称:线程池启动通知
  2581. * 描述:线程池启动时监听器将收到该通知,监听器可以在通知处理方法中执行预处理工作
  2582. *
  2583. * 参数: pThreadPool -- 线程池对象
  2584. * 返回值: 无
  2585. */
  2586. virtual void OnStartup(IHPThreadPool* pThreadPool) = 0;
  2587. /*
  2588. * 名称:线程池启动关闭通知
  2589. * 描述:线程池关闭时监听器将收到该通知,监听器可以在通知处理方法中执行后处理工作
  2590. *
  2591. * 参数: pThreadPool -- 线程池对象
  2592. * 返回值: 无
  2593. */
  2594. virtual void OnShutdown(IHPThreadPool* pThreadPool) = 0;
  2595. /*
  2596. * 名称:工作线程启动通知
  2597. * 描述:工作线程启动时监听器将收到该通知,监听器可以在通知处理方法中执行线程级别预处理工作
  2598. *
  2599. * 参数: pThreadPool -- 线程池对象
  2600. * dwThreadID -- 工作线程 ID
  2601. * 返回值: 无
  2602. */
  2603. virtual void OnWorkerThreadStart(IHPThreadPool* pThreadPool, THR_ID dwThreadID) = 0;
  2604. /*
  2605. * 名称:工作线程退出通知
  2606. * 描述:工作线程退出时监听器将收到该通知,监听器可以在通知处理方法中执行线程级别后处理工作
  2607. *
  2608. * 参数: pThreadPool -- 线程池对象
  2609. * dwThreadID -- 工作线程 ID
  2610. * 返回值: 无
  2611. */
  2612. virtual void OnWorkerThreadEnd(IHPThreadPool* pThreadPool, THR_ID dwThreadID) = 0;
  2613. public:
  2614. virtual ~IHPThreadPoolListener() {};
  2615. };
  2616. /************************************************************************
  2617. 名称:线程池监听器抽象基类
  2618. 描述:定义某些事件的默认处理方法(忽略事件)
  2619. ************************************************************************/
  2620. class CHPThreadPoolListener : public IHPThreadPoolListener
  2621. {
  2622. public:
  2623. virtual void OnStartup(IHPThreadPool* pThreadPool) {}
  2624. virtual void OnShutdown(IHPThreadPool* pThreadPool) {}
  2625. virtual void OnWorkerThreadStart(IHPThreadPool* pThreadPool, THR_ID dwThreadID) {}
  2626. virtual void OnWorkerThreadEnd(IHPThreadPool* pThreadPool, THR_ID dwThreadID) {}
  2627. };
  2628. /************************************************************************
  2629. 名称:压缩器接口
  2630. 描述:定义压缩器的所有操作方法和属性访问方法
  2631. ************************************************************************/
  2632. class IHPCompressor
  2633. {
  2634. public:
  2635. /***********************************************************************/
  2636. /***************************** 组件操作方法 *****************************/
  2637. /*
  2638. * 名称:执行压缩
  2639. * 描述:可循环调用以压缩流式或分段数据
  2640. *
  2641. * 参数: pData -- 待压缩数据缓冲区
  2642. * iLength -- 待压缩数据长度
  2643. * bLast -- 是否最后一段待压缩数据
  2644. * pContext -- 压缩回调函数 Fn_CompressDataCallback 的上下文参数
  2645. *
  2646. * 返回值: TRUE -- 成功
  2647. * FALSE -- 失败,可通过 SYS_GetLastError() 获取错误代码
  2648. */
  2649. virtual BOOL Process(const BYTE* pData, int iLength, BOOL bLast, PVOID pContext = nullptr) = 0;
  2650. /*
  2651. * 名称:执行压缩
  2652. * 描述:可循环调用以压缩流式或分段数据
  2653. *
  2654. * 参数: pData -- 待压缩数据缓冲区
  2655. * iLength -- 待压缩数据长度
  2656. * bLast -- 是否最后一段待压缩数据
  2657. * bFlush -- 是否强制刷新(强制刷新会降低压缩效率,但可对数据进行分段压缩)
  2658. * pContext -- 压缩回调函数 Fn_CompressDataCallback 的上下文参数
  2659. *
  2660. * 返回值: TRUE -- 成功
  2661. * FALSE -- 失败,可通过 SYS_GetLastError() 获取错误代码
  2662. */
  2663. virtual BOOL ProcessEx(const BYTE* pData, int iLength, BOOL bLast, BOOL bFlush = FALSE, PVOID pContext = nullptr) = 0;
  2664. /* 重置压缩器 */
  2665. virtual BOOL Reset() = 0;
  2666. /***********************************************************************/
  2667. /***************************** 属性访问方法 *****************************/
  2668. /* 检测压缩器是否可用 */
  2669. virtual BOOL IsValid() = 0;
  2670. public:
  2671. virtual ~IHPCompressor() {};
  2672. };
  2673. /************************************************************************
  2674. 名称:解压器接口
  2675. 描述:定义解压器的所有操作方法和属性访问方法
  2676. ************************************************************************/
  2677. class IHPDecompressor
  2678. {
  2679. public:
  2680. /***********************************************************************/
  2681. /***************************** 组件操作方法 *****************************/
  2682. /*
  2683. * 名称:执行解压
  2684. * 描述:可循环调用以解压流式或分段数据
  2685. *
  2686. * 参数: pData -- 待解压数据缓冲区
  2687. * iLength -- 待解压数据长度
  2688. * pContext -- 解压回调函数 Fn_DecompressDataCallback 的上下文参数
  2689. *
  2690. * 返回值: TRUE -- 成功
  2691. * FALSE -- 失败,可通过 SYS_GetLastError() 获取错误代码
  2692. */
  2693. virtual BOOL Process(const BYTE* pData, int iLength, PVOID pContext = nullptr) = 0;
  2694. /* 重置解压器 */
  2695. virtual BOOL Reset() = 0;
  2696. public:
  2697. /***********************************************************************/
  2698. /***************************** 属性访问方法 *****************************/
  2699. /* 检测解压器是否可用 */
  2700. virtual BOOL IsValid() = 0;
  2701. public:
  2702. virtual ~IHPDecompressor() {};
  2703. };