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

SocketInterface.h 76KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971
  1. /*
  2. * Copyright: JessMA Open Source (ldcsaa@gmail.com)
  3. *
  4. * Version : 4.1.3
  5. * Author : Bruce Liang
  6. * Website : http://www.jessma.org
  7. * Project : https://github.com/ldcsaa
  8. * Blog : http://www.cnblogs.com/ldcsaa
  9. * Wiki : http://www.oschina.net/p/hp-socket
  10. * QQ Group : 75375912
  11. *
  12. * Licensed under the Apache License, Version 2.0 (the "License");
  13. * you may not use this file except in compliance with the License.
  14. * You may obtain a copy of the License at
  15. *
  16. * http://www.apache.org/licenses/LICENSE-2.0
  17. *
  18. * Unless required by applicable law or agreed to in writing, software
  19. * distributed under the License is distributed on an "AS IS" BASIS,
  20. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  21. * See the License for the specific language governing permissions and
  22. * limitations under the License.
  23. */
  24. #pragma once
  25. #include <winsock2.h>
  26. #include "HPTypeDef.h"
  27. /*****************************************************************************************************************************************************/
  28. /***************************************************************** TCP/UDP Interfaces ****************************************************************/
  29. /*****************************************************************************************************************************************************/
  30. /************************************************************************
  31. 名称:复合 Socket 组件接口
  32. 描述:定义复合 Socket 组件的所有操作方法和属性访问方法,复合 Socket 组件同时管理多个 Socket 连接
  33. ************************************************************************/
  34. class IComplexSocket
  35. {
  36. public:
  37. /***********************************************************************/
  38. /***************************** 组件操作方法 *****************************/
  39. /*
  40. * 名称:关闭通信组件
  41. * 描述:关闭通信组件,关闭完成后断开所有连接并释放所有资源
  42. *
  43. * 参数:
  44. * 返回值: TRUE -- 成功
  45. * FALSE -- 失败,可通过 GetLastError() 获取错误代码
  46. */
  47. virtual BOOL Stop () = 0;
  48. /*
  49. * 名称:发送数据
  50. * 描述:向指定连接发送数据
  51. *
  52. * 参数: dwConnID -- 连接 ID
  53. * pBuffer -- 发送缓冲区
  54. * iLength -- 发送缓冲区长度
  55. * iOffset -- 发送缓冲区指针偏移量
  56. * 返回值: TRUE -- 成功
  57. * FALSE -- 失败,可通过 Windows API 函数 ::GetLastError() 获取 Windows 错误代码
  58. */
  59. virtual BOOL Send (CONNID dwConnID, const BYTE* pBuffer, int iLength, int iOffset = 0) = 0;
  60. /*
  61. * 名称:发送多组数据
  62. * 描述:向指定连接发送多组数据
  63. * TCP - 顺序发送所有数据包
  64. * UDP - 把所有数据包组合成一个数据包发送(数据包的总长度不能大于设置的 UDP 包最大长度)
  65. *
  66. * 参数: dwConnID -- 连接 ID
  67. * pBuffers -- 发送缓冲区数组
  68. * iCount -- 发送缓冲区数目
  69. * 返回值: TRUE -- 成功
  70. * FALSE -- 失败,可通过 Windows API 函数 ::GetLastError() 获取 Windows 错误代码
  71. */
  72. virtual BOOL SendPackets(CONNID dwConnID, const WSABUF pBuffers[], int iCount) = 0;
  73. /*
  74. * 名称:断开连接
  75. * 描述:断开某个连接
  76. *
  77. * 参数: dwConnID -- 连接 ID
  78. * bForce -- 是否强制断开连接
  79. * 返回值: TRUE -- 成功
  80. * FALSE -- 失败
  81. */
  82. virtual BOOL Disconnect(CONNID dwConnID, BOOL bForce = TRUE) = 0;
  83. /*
  84. * 名称:断开超时连接
  85. * 描述:断开超过指定时长的连接
  86. *
  87. * 参数: dwPeriod -- 时长(毫秒)
  88. * bForce -- 是否强制断开连接
  89. * 返回值: TRUE -- 成功
  90. * FALSE -- 失败
  91. */
  92. virtual BOOL DisconnectLongConnections(DWORD dwPeriod, BOOL bForce = TRUE) = 0;
  93. /*
  94. * 名称:断开静默连接
  95. * 描述:断开超过指定时长的静默连接
  96. *
  97. * 参数: dwPeriod -- 时长(毫秒)
  98. * bForce -- 是否强制断开连接
  99. * 返回值: TRUE -- 成功
  100. * FALSE -- 失败
  101. */
  102. virtual BOOL DisconnectSilenceConnections(DWORD dwPeriod, BOOL bForce = TRUE) = 0;
  103. public:
  104. /***********************************************************************/
  105. /***************************** 属性访问方法 *****************************/
  106. /*
  107. * 名称:设置连接的附加数据
  108. * 描述:是否为连接绑定附加数据或者绑定什么样的数据,均由应用程序自身决定
  109. *
  110. * 参数: dwConnID -- 连接 ID
  111. * pv -- 数据
  112. * 返回值: TRUE -- 成功
  113. * FALSE -- 失败(无效的连接 ID)
  114. */
  115. virtual BOOL SetConnectionExtra (CONNID dwConnID, PVOID pExtra) = 0;
  116. /*
  117. * 名称:获取连接的附加数据
  118. * 描述:是否为连接绑定附加数据或者绑定什么样的数据,均由应用程序自身决定
  119. *
  120. * 参数: dwConnID -- 连接 ID
  121. * ppv -- 数据指针
  122. * 返回值: TRUE -- 成功
  123. * FALSE -- 失败(无效的连接 ID)
  124. */
  125. virtual BOOL GetConnectionExtra (CONNID dwConnID, PVOID* ppExtra) = 0;
  126. /* 检查通信组件是否已启动 */
  127. virtual BOOL HasStarted () = 0;
  128. /* 查看通信组件当前状态 */
  129. virtual EnServiceState GetState () = 0;
  130. /* 获取连接数 */
  131. virtual DWORD GetConnectionCount () = 0;
  132. /* 获取所有连接的 CONNID */
  133. virtual BOOL GetAllConnectionIDs (CONNID pIDs[], DWORD& dwCount) = 0;
  134. /* 获取某个连接时长(毫秒) */
  135. virtual BOOL GetConnectPeriod (CONNID dwConnID, DWORD& dwPeriod) = 0;
  136. /* 获取某个连接静默时间(毫秒) */
  137. virtual BOOL GetSilencePeriod (CONNID dwConnID, DWORD& dwPeriod) = 0;
  138. /* 获取某个连接的本地地址信息 */
  139. virtual BOOL GetLocalAddress (CONNID dwConnID, TCHAR lpszAddress[], int& iAddressLen, USHORT& usPort) = 0;
  140. /* 获取某个连接的远程地址信息 */
  141. virtual BOOL GetRemoteAddress (CONNID dwConnID, TCHAR lpszAddress[], int& iAddressLen, USHORT& usPort) = 0;
  142. /* 获取最近一次失败操作的错误代码 */
  143. virtual EnSocketError GetLastError () = 0;
  144. /* 获取最近一次失败操作的错误描述 */
  145. virtual LPCTSTR GetLastErrorDesc () = 0;
  146. /* 获取连接中未发出数据的长度 */
  147. virtual BOOL GetPendingDataLength (CONNID dwConnID, int& iPending) = 0;
  148. /* 设置数据发送策略 */
  149. virtual void SetSendPolicy (EnSendPolicy enSendPolicy) = 0;
  150. /* 设置最大连接数(组件会根据设置值预分配内存,因此需要根据实际情况设置,不宜过大)*/
  151. virtual void SetMaxConnectionCount (DWORD dwMaxConnectionCount) = 0;
  152. /* 设置 Socket 缓存对象锁定时间(毫秒,在锁定期间该 Socket 缓存对象不能被获取使用) */
  153. virtual void SetFreeSocketObjLockTime (DWORD dwFreeSocketObjLockTime) = 0;
  154. /* 设置 Socket 缓存池大小(通常设置为平均并发连接数的 1/3 - 1/2) */
  155. virtual void SetFreeSocketObjPool (DWORD dwFreeSocketObjPool) = 0;
  156. /* 设置内存块缓存池大小(通常设置为 Socket 缓存池大小的 2 - 3 倍) */
  157. virtual void SetFreeBufferObjPool (DWORD dwFreeBufferObjPool) = 0;
  158. /* 设置 Socket 缓存池回收阀值(通常设置为 Socket 缓存池大小的 3 倍) */
  159. virtual void SetFreeSocketObjHold (DWORD dwFreeSocketObjHold) = 0;
  160. /* 设置内存块缓存池回收阀值(通常设置为内存块缓存池大小的 3 倍) */
  161. virtual void SetFreeBufferObjHold (DWORD dwFreeBufferObjHold) = 0;
  162. /* 设置工作线程数量(通常设置为 2 * CPU + 2) */
  163. virtual void SetWorkerThreadCount (DWORD dwWorkerThreadCount) = 0;
  164. /* 设置是否标记静默时间(设置为 TRUE 时 DisconnectSilenceConnections() 和 GetSilencePeriod() 才有效,默认:TRUE) */
  165. virtual void SetMarkSilence (BOOL bMarkSilence) = 0;
  166. /* 获取数据发送策略 */
  167. virtual EnSendPolicy GetSendPolicy () = 0;
  168. /* 获取最大连接数 */
  169. virtual DWORD GetMaxConnectionCount () = 0;
  170. /* 获取 Socket 缓存对象锁定时间 */
  171. virtual DWORD GetFreeSocketObjLockTime () = 0;
  172. /* 获取 Socket 缓存池大小 */
  173. virtual DWORD GetFreeSocketObjPool () = 0;
  174. /* 获取内存块缓存池大小 */
  175. virtual DWORD GetFreeBufferObjPool () = 0;
  176. /* 获取 Socket 缓存池回收阀值 */
  177. virtual DWORD GetFreeSocketObjHold () = 0;
  178. /* 获取内存块缓存池回收阀值 */
  179. virtual DWORD GetFreeBufferObjHold () = 0;
  180. /* 获取工作线程数量 */
  181. virtual DWORD GetWorkerThreadCount () = 0;
  182. /* 检测是否标记静默时间 */
  183. virtual BOOL IsMarkSilence () = 0;
  184. public:
  185. virtual ~IComplexSocket() {}
  186. };
  187. /************************************************************************
  188. 名称:通信服务端组件接口
  189. 描述:定义通信服务端组件的所有操作方法和属性访问方法
  190. ************************************************************************/
  191. class IServer : public IComplexSocket
  192. {
  193. public:
  194. /***********************************************************************/
  195. /***************************** 组件操作方法 *****************************/
  196. /*
  197. * 名称:启动通信组件
  198. * 描述:启动服务端通信组件,启动完成后可开始接收客户端连接并收发数据
  199. *
  200. * 参数: lpszBindAddress -- 监听地址
  201. * usPort -- 监听端口
  202. * 返回值: TRUE -- 成功
  203. * FALSE -- 失败,可通过 GetLastError() 获取错误代码
  204. */
  205. virtual BOOL Start (LPCTSTR lpszBindAddress, USHORT usPort) = 0;
  206. public:
  207. /***********************************************************************/
  208. /***************************** 属性访问方法 *****************************/
  209. /* 获取监听 Socket 的地址信息 */
  210. virtual BOOL GetListenAddress(TCHAR lpszAddress[], int& iAddressLen, USHORT& usPort) = 0;
  211. };
  212. /************************************************************************
  213. 名称:TCP 通信服务端组件接口
  214. 描述:定义 TCP 通信服务端组件的所有操作方法和属性访问方法
  215. ************************************************************************/
  216. class ITcpServer : public IServer
  217. {
  218. public:
  219. /***********************************************************************/
  220. /***************************** 组件操作方法 *****************************/
  221. /*
  222. * 名称:发送小文件
  223. * 描述:向指定连接发送 4096 KB 以下的小文件
  224. *
  225. * 参数: dwConnID -- 连接 ID
  226. * lpszFileName -- 文件路径
  227. * pHead -- 头部附加数据
  228. * pTail -- 尾部附加数据
  229. * 返回值: TRUE -- 成功
  230. * FALSE -- 失败,可通过 Windows API 函数 ::GetLastError() 获取 Windows 错误代码
  231. */
  232. virtual BOOL SendSmallFile(CONNID dwConnID, LPCTSTR lpszFileName, const LPWSABUF pHead = nullptr, const LPWSABUF pTail = nullptr) = 0;
  233. public:
  234. /***********************************************************************/
  235. /***************************** 属性访问方法 *****************************/
  236. /* 设置 Accept 预投递数量(根据负载调整设置,Accept 预投递数量越大则支持的并发连接请求越多) */
  237. virtual void SetAcceptSocketCount (DWORD dwAcceptSocketCount) = 0;
  238. /* 设置通信数据缓冲区大小(根据平均通信数据包大小调整设置,通常设置为 1024 的倍数) */
  239. virtual void SetSocketBufferSize (DWORD dwSocketBufferSize) = 0;
  240. /* 设置监听 Socket 的等候队列大小(根据并发连接数量调整设置) */
  241. virtual void SetSocketListenQueue (DWORD dwSocketListenQueue) = 0;
  242. /* 设置正常心跳包间隔(毫秒,0 则不发送心跳包,默认:30 * 1000) */
  243. virtual void SetKeepAliveTime (DWORD dwKeepAliveTime) = 0;
  244. /* 设置异常心跳包间隔(毫秒,0 不发送心跳包,,默认:10 * 1000,如果超过若干次 [默认:WinXP 5 次, Win7 10 次] 检测不到心跳确认包则认为已断线) */
  245. virtual void SetKeepAliveInterval (DWORD dwKeepAliveInterval) = 0;
  246. /* 获取 Accept 预投递数量 */
  247. virtual DWORD GetAcceptSocketCount () = 0;
  248. /* 获取通信数据缓冲区大小 */
  249. virtual DWORD GetSocketBufferSize () = 0;
  250. /* 获取监听 Socket 的等候队列大小 */
  251. virtual DWORD GetSocketListenQueue () = 0;
  252. /* 获取正常心跳包间隔 */
  253. virtual DWORD GetKeepAliveTime () = 0;
  254. /* 获取异常心跳包间隔 */
  255. virtual DWORD GetKeepAliveInterval () = 0;
  256. };
  257. /************************************************************************
  258. 名称:UDP 通信服务端组件接口
  259. 描述:定义 UDP 通信服务端组件的所有操作方法和属性访问方法
  260. ************************************************************************/
  261. class IUdpServer : public IServer
  262. {
  263. public:
  264. /***********************************************************************/
  265. /***************************** 组件操作方法 *****************************/
  266. public:
  267. /***********************************************************************/
  268. /***************************** 属性访问方法 *****************************/
  269. /* 设置数据报文最大长度(建议在局域网环境下不超过 1472 字节,在广域网环境下不超过 548 字节) */
  270. virtual void SetMaxDatagramSize (DWORD dwMaxDatagramSize) = 0;
  271. /* 获取数据报文最大长度 */
  272. virtual DWORD GetMaxDatagramSize () = 0;
  273. /* 设置 Receive 预投递数量(根据负载调整设置,Receive 预投递数量越大则丢包概率越小) */
  274. virtual void SetPostReceiveCount (DWORD dwPostReceiveCount) = 0;
  275. /* 获取 Receive 预投递数量 */
  276. virtual DWORD GetPostReceiveCount () = 0;
  277. /* 设置监测包尝试次数(0 则不发送监测跳包,如果超过最大尝试次数则认为已断线) */
  278. virtual void SetDetectAttempts (DWORD dwDetectAttempts) = 0;
  279. /* 设置监测包发送间隔(秒,0 不发送监测包) */
  280. virtual void SetDetectInterval (DWORD dwDetectInterval) = 0;
  281. /* 获取心跳检查次数 */
  282. virtual DWORD GetDetectAttempts () = 0;
  283. /* 获取心跳检查间隔 */
  284. virtual DWORD GetDetectInterval () = 0;
  285. };
  286. /************************************************************************
  287. 名称:通信代理组件接口
  288. 描述:定义通信代理组件的所有操作方法和属性访问方法,代理组件本质是一个同时连接多个服务器的客户端组件
  289. ************************************************************************/
  290. class IAgent : public IComplexSocket
  291. {
  292. public:
  293. /***********************************************************************/
  294. /***************************** 组件操作方法 *****************************/
  295. /*
  296. * 名称:启动通信组件
  297. * 描述:启动通信代理组件,启动完成后可开始连接远程服务器
  298. *
  299. * 参数: lpszBindAddress -- 绑定地址(默认:nullptr,绑定 0.0.0.0)
  300. * bAsyncConnect -- 是否采用异步 Connect
  301. * 返回值: TRUE -- 成功
  302. * FALSE -- 失败,可通过 GetLastError() 获取错误代码
  303. */
  304. virtual BOOL Start (LPCTSTR lpszBindAddress = nullptr, BOOL bAsyncConnect = TRUE) = 0;
  305. /*
  306. * 名称:连接服务器
  307. * 描述:连接服务器,连接成功后 IAgentListener 会接收到 OnConnect() / OnHandShake() 事件
  308. *
  309. * 参数: lpszRemoteAddress -- 服务端地址
  310. * usPort -- 服务端端口
  311. * pdwConnID -- 连接 ID(默认:nullptr,不获取连接 ID)
  312. * 返回值: TRUE -- 成功
  313. * FALSE -- 失败,可通过 Windows API 函数 ::GetLastError() 获取 Windows 错误代码
  314. */
  315. virtual BOOL Connect (LPCTSTR lpszRemoteAddress, USHORT usPort, CONNID* pdwConnID = nullptr) = 0;
  316. public:
  317. /***********************************************************************/
  318. /***************************** 属性访问方法 *****************************/
  319. /* 获取某个连接的远程主机信息 */
  320. virtual BOOL GetRemoteHost (CONNID dwConnID, TCHAR lpszHost[], int& iHostLen, USHORT& usPort) = 0;
  321. };
  322. /************************************************************************
  323. 名称:TCP 通信代理组件接口
  324. 描述:定义 TCP 通信代理组件的所有操作方法和属性访问方法
  325. ************************************************************************/
  326. class ITcpAgent : public IAgent
  327. {
  328. public:
  329. /***********************************************************************/
  330. /***************************** 组件操作方法 *****************************/
  331. /*
  332. * 名称:发送小文件
  333. * 描述:向指定连接发送 4096 KB 以下的小文件
  334. *
  335. * 参数: dwConnID -- 连接 ID
  336. * lpszFileName -- 文件路径
  337. * pHead -- 头部附加数据
  338. * pTail -- 尾部附加数据
  339. * 返回值: TRUE -- 成功
  340. * FALSE -- 失败,可通过 Windows API 函数 ::GetLastError() 获取 Windows 错误代码
  341. */
  342. virtual BOOL SendSmallFile(CONNID dwConnID, LPCTSTR lpszFileName, const LPWSABUF pHead = nullptr, const LPWSABUF pTail = nullptr) = 0;
  343. public:
  344. /***********************************************************************/
  345. /***************************** 属性访问方法 *****************************/
  346. /* 设置是否启用地址重用机制(默认:不启用) */
  347. virtual void SetReuseAddress (BOOL bReuseAddress) = 0;
  348. /* 检测是否启用地址重用机制 */
  349. virtual BOOL IsReuseAddress () = 0;
  350. /* 设置通信数据缓冲区大小(根据平均通信数据包大小调整设置,通常设置为 1024 的倍数) */
  351. virtual void SetSocketBufferSize (DWORD dwSocketBufferSize) = 0;
  352. /* 设置正常心跳包间隔(毫秒,0 则不发送心跳包,默认:30 * 1000) */
  353. virtual void SetKeepAliveTime (DWORD dwKeepAliveTime) = 0;
  354. /* 设置异常心跳包间隔(毫秒,0 不发送心跳包,,默认:10 * 1000,如果超过若干次 [默认:WinXP 5 次, Win7 10 次] 检测不到心跳确认包则认为已断线) */
  355. virtual void SetKeepAliveInterval (DWORD dwKeepAliveInterval) = 0;
  356. /* 获取通信数据缓冲区大小 */
  357. virtual DWORD GetSocketBufferSize () = 0;
  358. /* 获取正常心跳包间隔 */
  359. virtual DWORD GetKeepAliveTime () = 0;
  360. /* 获取异常心跳包间隔 */
  361. virtual DWORD GetKeepAliveInterval () = 0;
  362. };
  363. /************************************************************************
  364. 名称:通信客户端组件接口
  365. 描述:定义通信客户端组件的所有操作方法和属性访问方法
  366. ************************************************************************/
  367. class IClient
  368. {
  369. public:
  370. /***********************************************************************/
  371. /***************************** 组件操作方法 *****************************/
  372. /*
  373. * 名称:启动通信组件
  374. * 描述:启动客户端通信组件并连接服务端,启动完成后可开始收发数据
  375. *
  376. * 参数: lpszRemoteAddress -- 服务端地址
  377. * usPort -- 服务端端口
  378. * bAsyncConnect -- 是否采用异步 Connect
  379. * lpszBindAddress -- 绑定地址(默认:nullptr,TcpClient/UdpClient -> 不执行绑定操作,UdpCast 绑定 -> 0.0.0.0)
  380. * 返回值: TRUE -- 成功
  381. * FALSE -- 失败,可通过 GetLastError() 获取错误代码
  382. */
  383. virtual BOOL Start (LPCTSTR lpszRemoteAddress, USHORT usPort, BOOL bAsyncConnect = TRUE, LPCTSTR lpszBindAddress = nullptr) = 0;
  384. /*
  385. * 名称:关闭通信组件
  386. * 描述:关闭客户端通信组件,关闭完成后断开与服务端的连接并释放所有资源
  387. *
  388. * 参数:
  389. * 返回值: TRUE -- 成功
  390. * FALSE -- 失败,可通过 GetLastError() 获取错误代码
  391. */
  392. virtual BOOL Stop () = 0;
  393. /*
  394. * 名称:发送数据
  395. * 描述:向服务端发送数据
  396. *
  397. * 参数: pBuffer -- 发送缓冲区
  398. * iLength -- 发送缓冲区长度
  399. * iOffset -- 发送缓冲区指针偏移量
  400. * 返回值: TRUE -- 成功
  401. * FALSE -- 失败,可通过 Windows API 函数 ::GetLastError() 获取 Windows 错误代码
  402. */
  403. virtual BOOL Send (const BYTE* pBuffer, int iLength, int iOffset = 0) = 0;
  404. /*
  405. * 名称:发送多组数据
  406. * 描述:向服务端发送多组数据
  407. * TCP - 顺序发送所有数据包
  408. * UDP - 把所有数据包组合成一个数据包发送(数据包的总长度不能大于设置的 UDP 包最大长度)
  409. *
  410. * 参数: pBuffers -- 发送缓冲区数组
  411. * iCount -- 发送缓冲区数目
  412. * 返回值: TRUE -- 成功
  413. * FALSE -- 失败,可通过 Windows API 函数 ::GetLastError() 获取 Windows 错误代码
  414. */
  415. virtual BOOL SendPackets(const WSABUF pBuffers[], int iCount) = 0;
  416. public:
  417. /***********************************************************************/
  418. /***************************** 属性访问方法 *****************************/
  419. /* 设置连接的附加数据 */
  420. virtual void SetExtra (PVOID pExtra) = 0;
  421. /* 获取连接的附加数据 */
  422. virtual PVOID GetExtra () = 0;
  423. /* 检查通信组件是否已启动 */
  424. virtual BOOL HasStarted () = 0;
  425. /* 查看通信组件当前状态 */
  426. virtual EnServiceState GetState () = 0;
  427. /* 获取最近一次失败操作的错误代码 */
  428. virtual EnSocketError GetLastError () = 0;
  429. /* 获取最近一次失败操作的错误描述 */
  430. virtual LPCTSTR GetLastErrorDesc() = 0;
  431. /* 获取该组件对象的连接 ID */
  432. virtual CONNID GetConnectionID () = 0;
  433. /* 获取 Client Socket 的地址信息 */
  434. virtual BOOL GetLocalAddress (TCHAR lpszAddress[], int& iAddressLen, USHORT& usPort) = 0;
  435. /* 获取连接的远程主机信息 */
  436. virtual BOOL GetRemoteHost (TCHAR lpszHost[], int& iHostLen, USHORT& usPort) = 0;
  437. /* 获取连接中未发出数据的长度 */
  438. virtual BOOL GetPendingDataLength (int& iPending) = 0;
  439. /* 设置内存块缓存池大小(通常设置为 -> PUSH 模型:5 - 10;PULL 模型:10 - 20 ) */
  440. virtual void SetFreeBufferPoolSize (DWORD dwFreeBufferPoolSize) = 0;
  441. /* 设置内存块缓存池回收阀值(通常设置为内存块缓存池大小的 3 倍) */
  442. virtual void SetFreeBufferPoolHold (DWORD dwFreeBufferPoolHold) = 0;
  443. /* 获取内存块缓存池大小 */
  444. virtual DWORD GetFreeBufferPoolSize () = 0;
  445. /* 获取内存块缓存池回收阀值 */
  446. virtual DWORD GetFreeBufferPoolHold () = 0;
  447. public:
  448. virtual ~IClient() {}
  449. };
  450. /************************************************************************
  451. 名称:TCP 通信客户端组件接口
  452. 描述:定义 TCP 通信客户端组件的所有操作方法和属性访问方法
  453. ************************************************************************/
  454. class ITcpClient : public IClient
  455. {
  456. public:
  457. /***********************************************************************/
  458. /***************************** 组件操作方法 *****************************/
  459. /*
  460. * 名称:发送小文件
  461. * 描述:向服务端发送 4096 KB 以下的小文件
  462. *
  463. * 参数: lpszFileName -- 文件路径
  464. * pHead -- 头部附加数据
  465. * pTail -- 尾部附加数据
  466. * 返回值: TRUE -- 成功
  467. * FALSE -- 失败,可通过 Windows API 函数 ::GetLastError() 获取 Windows 错误代码
  468. */
  469. virtual BOOL SendSmallFile(LPCTSTR lpszFileName, const LPWSABUF pHead = nullptr, const LPWSABUF pTail = nullptr) = 0;
  470. public:
  471. /***********************************************************************/
  472. /***************************** 属性访问方法 *****************************/
  473. /* 设置通信数据缓冲区大小(根据平均通信数据包大小调整设置,通常设置为:(N * 1024) - sizeof(TBufferObj)) */
  474. virtual void SetSocketBufferSize (DWORD dwSocketBufferSize) = 0;
  475. /* 设置正常心跳包间隔(毫秒,0 则不发送心跳包,默认:30 * 1000) */
  476. virtual void SetKeepAliveTime (DWORD dwKeepAliveTime) = 0;
  477. /* 设置异常心跳包间隔(毫秒,0 不发送心跳包,,默认:10 * 1000,如果超过若干次 [默认:WinXP 5 次, Win7 10 次] 检测不到心跳确认包则认为已断线) */
  478. virtual void SetKeepAliveInterval (DWORD dwKeepAliveInterval) = 0;
  479. /* 获取通信数据缓冲区大小 */
  480. virtual DWORD GetSocketBufferSize () = 0;
  481. /* 获取正常心跳包间隔 */
  482. virtual DWORD GetKeepAliveTime () = 0;
  483. /* 获取异常心跳包间隔 */
  484. virtual DWORD GetKeepAliveInterval () = 0;
  485. };
  486. /************************************************************************
  487. 名称:UDP 通信客户端组件接口
  488. 描述:定义 UDP 通信客户端组件的所有操作方法和属性访问方法
  489. ************************************************************************/
  490. class IUdpClient : public IClient
  491. {
  492. public:
  493. /***********************************************************************/
  494. /***************************** 组件操作方法 *****************************/
  495. public:
  496. /***********************************************************************/
  497. /***************************** 属性访问方法 *****************************/
  498. /* 设置数据报文最大长度(建议在局域网环境下不超过 1472 字节,在广域网环境下不超过 548 字节) */
  499. virtual void SetMaxDatagramSize (DWORD dwMaxDatagramSize) = 0;
  500. /* 获取数据报文最大长度 */
  501. virtual DWORD GetMaxDatagramSize() = 0;
  502. /* 设置监测包尝试次数(0 则不发送监测跳包,如果超过最大尝试次数则认为已断线) */
  503. virtual void SetDetectAttempts (DWORD dwDetectAttempts) = 0;
  504. /* 设置监测包发送间隔(秒,0 不发送监测包) */
  505. virtual void SetDetectInterval (DWORD dwDetectInterval) = 0;
  506. /* 获取心跳检查次数 */
  507. virtual DWORD GetDetectAttempts () = 0;
  508. /* 获取心跳检查间隔 */
  509. virtual DWORD GetDetectInterval () = 0;
  510. };
  511. /************************************************************************
  512. 名称:UDP 传播组件接口
  513. 描述:定义 UDP 传播(组播或广播)组件的所有操作方法和属性访问方法
  514. ************************************************************************/
  515. class IUdpCast : public IClient
  516. {
  517. public:
  518. /***********************************************************************/
  519. /***************************** 组件操作方法 *****************************/
  520. public:
  521. /***********************************************************************/
  522. /***************************** 属性访问方法 *****************************/
  523. /* 设置数据报文最大长度(建议在局域网环境下不超过 1472 字节,在广域网环境下不超过 548 字节) */
  524. virtual void SetMaxDatagramSize (DWORD dwMaxDatagramSize) = 0;
  525. /* 获取数据报文最大长度 */
  526. virtual DWORD GetMaxDatagramSize() = 0;
  527. /* 设置是否启用地址重用机制(默认:不启用) */
  528. virtual void SetReuseAddress (BOOL bReuseAddress) = 0;
  529. /* 检测是否启用地址重用机制 */
  530. virtual BOOL IsReuseAddress () = 0;
  531. /* 设置传播模式(组播或广播) */
  532. virtual void SetCastMode (EnCastMode enCastMode) = 0;
  533. /* 获取传播模式 */
  534. virtual EnCastMode GetCastMode () = 0;
  535. /* 设置组播报文的 TTL(0 - 255) */
  536. virtual void SetMultiCastTtl (int iMCTtl) = 0;
  537. /* 获取组播报文的 TTL */
  538. virtual int GetMultiCastTtl () = 0;
  539. /* 设置是否启用组播环路(TRUE or FALSE) */
  540. virtual void SetMultiCastLoop (BOOL bMCLoop) = 0;
  541. /* 检测是否启用组播环路 */
  542. virtual BOOL IsMultiCastLoop () = 0;
  543. /* 获取当前数据报的远程地址信息(通常在 OnReceive 事件中调用) */
  544. virtual BOOL GetRemoteAddress (TCHAR lpszAddress[], int& iAddressLen, USHORT& usPort) = 0;
  545. };
  546. /************************************************************************
  547. 名称:双接口模版类
  548. 描述:定义双接口转换方法
  549. ************************************************************************/
  550. template<class F, class S> class DualInterface : public F, public S
  551. {
  552. public:
  553. /* this 转换为 F* */
  554. inline static F* ToF(DualInterface* pThis)
  555. {
  556. return (F*)(pThis);
  557. }
  558. /* F* 转换为 this */
  559. inline static DualInterface* FromF(F* pF)
  560. {
  561. return (DualInterface*)(pF);
  562. }
  563. /* this 转换为 S* */
  564. inline static S* ToS(DualInterface* pThis)
  565. {
  566. return (S*)(F2S(ToF(pThis)));
  567. }
  568. /* S* 转换为 this */
  569. inline static DualInterface* FromS(S* pS)
  570. {
  571. return FromF(S2F(pS));
  572. }
  573. /* S* 转换为 F* */
  574. inline static F* S2F(S* pS)
  575. {
  576. return (F*)((char*)pS - sizeof(F));
  577. }
  578. /* F* 转换为 S* */
  579. inline static S* F2S(F* pF)
  580. {
  581. return (S*)((char*)pF + sizeof(F));
  582. }
  583. public:
  584. ~DualInterface() {}
  585. };
  586. /************************************************************************
  587. 名称:Server/Agent PULL 模型组件接口
  588. 描述:定义 Server/Agent 组件的 PULL 模型组件的所有操作方法
  589. ************************************************************************/
  590. class IPullSocket
  591. {
  592. public:
  593. /*
  594. * 名称:抓取数据
  595. * 描述:用户通过该方法从 Socket 组件中抓取数据
  596. *
  597. * 参数: dwConnID -- 连接 ID
  598. * pData -- 抓取缓冲区
  599. * iLength -- 抓取数据长度
  600. * 返回值: EnFetchResult
  601. */
  602. virtual EnFetchResult Fetch (CONNID dwConnID, BYTE* pData, int iLength) = 0;
  603. /*
  604. * 名称:窥探数据(不会移除缓冲区数据)
  605. * 描述:用户通过该方法从 Socket 组件中窥探数据
  606. *
  607. * 参数: dwConnID -- 连接 ID
  608. * pData -- 窥探缓冲区
  609. * iLength -- 窥探数据长度
  610. * 返回值: EnFetchResult
  611. */
  612. virtual EnFetchResult Peek (CONNID dwConnID, BYTE* pData, int iLength) = 0;
  613. public:
  614. virtual ~IPullSocket() {}
  615. };
  616. /************************************************************************
  617. 名称:Client PULL 模型组件接口
  618. 描述:定义 Client 组件的 PULL 模型组件的所有操作方法
  619. ************************************************************************/
  620. class IPullClient
  621. {
  622. public:
  623. /*
  624. * 名称:抓取数据
  625. * 描述:用户通过该方法从 Socket 组件中抓取数据
  626. *
  627. * 参数: pData -- 抓取缓冲区
  628. * iLength -- 抓取数据长度
  629. * 返回值: EnFetchResult
  630. */
  631. virtual EnFetchResult Fetch (BYTE* pData, int iLength) = 0;
  632. /*
  633. * 名称:窥探数据(不会移除缓冲区数据)
  634. * 描述:用户通过该方法从 Socket 组件中窥探数据
  635. *
  636. * 参数: pData -- 窥探缓冲区
  637. * iLength -- 窥探数据长度
  638. * 返回值: EnFetchResult
  639. */
  640. virtual EnFetchResult Peek (BYTE* pData, int iLength) = 0;
  641. public:
  642. virtual ~IPullClient() {}
  643. };
  644. /************************************************************************
  645. 名称:TCP PULL 模型组件接口
  646. 描述:继承了 PULL 和 Socket 接口
  647. ************************************************************************/
  648. typedef DualInterface<IPullSocket, ITcpServer> ITcpPullServer;
  649. typedef DualInterface<IPullSocket, ITcpAgent> ITcpPullAgent;
  650. typedef DualInterface<IPullClient, ITcpClient> ITcpPullClient;
  651. /************************************************************************
  652. 名称:Server/Agent PACK 模型组件接口
  653. 描述:定义 Server/Agent 组件的 PACK 模型组件的所有操作方法
  654. ************************************************************************/
  655. class IPackSocket
  656. {
  657. public:
  658. /***********************************************************************/
  659. /***************************** 属性访问方法 *****************************/
  660. /* 设置数据包最大长度(有效数据包最大长度不能超过 4194303/0x3FFFFF 字节,默认:262144/0x40000) */
  661. virtual void SetMaxPackSize (DWORD dwMaxPackSize) = 0;
  662. /* 设置包头标识(有效包头标识取值范围 0 ~ 1023/0x3FF,当包头标识为 0 时不校验包头,默认:0) */
  663. virtual void SetPackHeaderFlag (USHORT usPackHeaderFlag) = 0;
  664. /* 获取数据包最大长度 */
  665. virtual DWORD GetMaxPackSize () = 0;
  666. /* 获取包头标识 */
  667. virtual USHORT GetPackHeaderFlag() = 0;
  668. public:
  669. virtual ~IPackSocket() {}
  670. };
  671. /************************************************************************
  672. 名称:Client PACK 模型组件接口
  673. 描述:定义 Client 组件的 PACK 模型组件的所有操作方法
  674. ************************************************************************/
  675. class IPackClient
  676. {
  677. public:
  678. /***********************************************************************/
  679. /***************************** 属性访问方法 *****************************/
  680. /* 设置数据包最大长度(有效数据包最大长度不能超过 4194303/0x3FFFFF 字节,默认:262144/0x40000) */
  681. virtual void SetMaxPackSize (DWORD dwMaxPackSize) = 0;
  682. /* 设置包头标识(有效包头标识取值范围 0 ~ 1023/0x3FF,当包头标识为 0 时不校验包头,默认:0) */
  683. virtual void SetPackHeaderFlag (USHORT usPackHeaderFlag) = 0;
  684. /* 获取数据包最大长度 */
  685. virtual DWORD GetMaxPackSize () = 0;
  686. /* 获取包头标识 */
  687. virtual USHORT GetPackHeaderFlag() = 0;
  688. public:
  689. virtual ~IPackClient() {}
  690. };
  691. /************************************************************************
  692. 名称:TCP PACK 模型组件接口
  693. 描述:继承了 PACK 和 Socket 接口
  694. ************************************************************************/
  695. typedef DualInterface<IPackSocket, ITcpServer> ITcpPackServer;
  696. typedef DualInterface<IPackSocket, ITcpAgent> ITcpPackAgent;
  697. typedef DualInterface<IPackClient, ITcpClient> ITcpPackClient;
  698. /************************************************************************
  699. 名称:Socket 监听器基接口
  700. 描述:定义组件监听器的公共方法
  701. ************************************************************************/
  702. template<class T> class ISocketListenerT
  703. {
  704. public:
  705. /*
  706. * 名称:握手完成通知
  707. * 描述:连接完成握手时,Socket 监听器将收到该通知,监听器接收到该通知后才能开始
  708. * 数据收发操作
  709. *
  710. * 参数: pSender -- 事件源对象
  711. * dwConnID -- 连接 ID
  712. * 返回值: HR_OK / HR_IGNORE -- 继续执行
  713. * HR_ERROR -- 引发 OnClose() 事件并关闭连接
  714. */
  715. virtual EnHandleResult OnHandShake(T* pSender, CONNID dwConnID) = 0;
  716. /*
  717. * 名称:已发送数据通知
  718. * 描述:成功发送数据后,Socket 监听器将收到该通知
  719. *
  720. * 参数: pSender -- 事件源对象
  721. * dwConnID -- 连接 ID
  722. * pData -- 已发送数据缓冲区
  723. * iLength -- 已发送数据长度
  724. * 返回值: HR_OK / HR_IGNORE -- 继续执行
  725. * HR_ERROR -- 该通知不允许返回 HR_ERROR(调试模式下引发断言错误)
  726. */
  727. virtual EnHandleResult OnSend(T* pSender, CONNID dwConnID, const BYTE* pData, int iLength) = 0;
  728. /*
  729. * 名称:数据到达通知(PUSH 模型)
  730. * 描述:对于 PUSH 模型的 Socket 通信组件,成功接收数据后将向 Socket 监听器发送该通知
  731. *
  732. * 参数: pSender -- 事件源对象
  733. * dwConnID -- 连接 ID
  734. * pData -- 已接收数据缓冲区
  735. * iLength -- 已接收数据长度
  736. * 返回值: HR_OK / HR_IGNORE -- 继续执行
  737. * HR_ERROR -- 引发 OnClose() 事件并关闭连接
  738. */
  739. virtual EnHandleResult OnReceive(T* pSender, CONNID dwConnID, const BYTE* pData, int iLength) = 0;
  740. /*
  741. * 名称:数据到达通知(PULL 模型)
  742. * 描述:对于 PULL 模型的 Socket 通信组件,成功接收数据后将向 Socket 监听器发送该通知
  743. *
  744. * 参数: pSender -- 事件源对象
  745. * dwConnID -- 连接 ID
  746. * iLength -- 已接收数据长度
  747. * 返回值: HR_OK / HR_IGNORE -- 继续执行
  748. * HR_ERROR -- 引发 OnClose() 事件并关闭连接
  749. */
  750. virtual EnHandleResult OnReceive(T* pSender, CONNID dwConnID, int iLength) = 0;
  751. /*
  752. * 名称:通信错误通知
  753. * 描述:通信发生错误后,Socket 监听器将收到该通知,并关闭连接
  754. *
  755. * 参数: pSender -- 事件源对象
  756. * dwConnID -- 连接 ID
  757. * enOperation -- Socket 操作类型
  758. * iErrorCode -- 错误代码
  759. * 返回值: 忽略返回值
  760. */
  761. virtual EnHandleResult OnClose(T* pSender, CONNID dwConnID, EnSocketOperation enOperation, int iErrorCode) = 0;
  762. public:
  763. virtual ~ISocketListenerT() {}
  764. };
  765. template<class T> class IComplexSocketListenerT : public ISocketListenerT<T>
  766. {
  767. public:
  768. /*
  769. * 名称:关闭通信组件通知
  770. * 描述:通信组件关闭时,Socket 监听器将收到该通知
  771. *
  772. * 参数: pSender -- 事件源对象
  773. * 返回值:忽略返回值
  774. */
  775. virtual EnHandleResult OnShutdown(T* pSender) = 0;
  776. };
  777. /************************************************************************
  778. 名称:服务端 Socket 监听器接口
  779. 描述:定义服务端 Socket 监听器的所有事件
  780. ************************************************************************/
  781. template<class T> class IServerListenerT : public IComplexSocketListenerT<T>
  782. {
  783. public:
  784. /*
  785. * 名称:准备监听通知
  786. * 描述:通信服务端组件启动时,在监听 Socket 创建完成并开始执行监听前,Socket 监听
  787. * 器将收到该通知,监听器可以在通知处理方法中执行 Socket 选项设置等额外工作
  788. *
  789. * 参数: pSender -- 事件源对象
  790. * soListen -- 监听 Socket
  791. * 返回值: HR_OK / HR_IGNORE -- 继续执行
  792. * HR_ERROR -- 终止启动通信服务组件
  793. */
  794. virtual EnHandleResult OnPrepareListen(T* pSender, SOCKET soListen) = 0;
  795. /*
  796. * 名称:接收连接通知
  797. * 描述:接收到客户端连接请求时,Socket 监听器将收到该通知,监听器可以在通知处理方
  798. * 法中执行 Socket 选项设置或拒绝客户端连接等额外工作
  799. *
  800. * 参数: pSender -- 事件源对象
  801. * dwConnID -- 连接 ID
  802. * soClient -- TCP: 客户端 Socket 句柄,UDP: 客户端 Socket SOCKADDR_IN 指针
  803. * 返回值: HR_OK / HR_IGNORE -- 接受连接
  804. * HR_ERROR -- 拒绝连接
  805. */
  806. virtual EnHandleResult OnAccept(T* pSender, CONNID dwConnID, UINT_PTR soClient) = 0;
  807. };
  808. /************************************************************************
  809. 名称:TCP 服务端 Socket 监听器接口
  810. 描述:定义 TCP 服务端 Socket 监听器的所有事件
  811. ************************************************************************/
  812. class ITcpServerListener : public IServerListenerT<ITcpServer>
  813. {
  814. public:
  815. };
  816. /************************************************************************
  817. 名称:PUSH 模型服务端 Socket 监听器抽象基类
  818. 描述:定义某些事件的默认处理方法(忽略事件)
  819. ************************************************************************/
  820. class CTcpServerListener : public ITcpServerListener
  821. {
  822. public:
  823. virtual EnHandleResult OnPrepareListen(ITcpServer* pSender, SOCKET soListen) {return HR_IGNORE;}
  824. virtual EnHandleResult OnAccept(ITcpServer* pSender, CONNID dwConnID, UINT_PTR soClient) {return HR_IGNORE;}
  825. virtual EnHandleResult OnHandShake(ITcpServer* pSender, CONNID dwConnID) {return HR_IGNORE;}
  826. virtual EnHandleResult OnReceive(ITcpServer* pSender, CONNID dwConnID, int iLength) {return HR_IGNORE;}
  827. virtual EnHandleResult OnSend(ITcpServer* pSender, CONNID dwConnID, const BYTE* pData, int iLength) {return HR_IGNORE;}
  828. virtual EnHandleResult OnShutdown(ITcpServer* pSender) {return HR_IGNORE;}
  829. };
  830. /************************************************************************
  831. 名称:PULL 模型服务端 Socket 监听器抽象基类
  832. 描述:定义某些事件的默认处理方法(忽略事件)
  833. ************************************************************************/
  834. class CTcpPullServerListener : public CTcpServerListener
  835. {
  836. public:
  837. virtual EnHandleResult OnReceive(ITcpServer* pSender, CONNID dwConnID, int iLength) = 0;
  838. virtual EnHandleResult OnReceive(ITcpServer* pSender, CONNID dwConnID, const BYTE* pData, int iLength) {return HR_IGNORE;}
  839. };
  840. /************************************************************************
  841. 名称:UDP 服务端 Socket 监听器接口
  842. 描述:定义 UDP 服务端 Socket 监听器的所有事件
  843. ************************************************************************/
  844. class IUdpServerListener : public IServerListenerT<IUdpServer>
  845. {
  846. public:
  847. };
  848. /************************************************************************
  849. 名称:UDP 服务端 Socket 监听器抽象基类
  850. 描述:定义某些事件的默认处理方法(忽略事件)
  851. ************************************************************************/
  852. class CUdpServerListener : public IUdpServerListener
  853. {
  854. public:
  855. virtual EnHandleResult OnPrepareListen(IUdpServer* pSender, SOCKET soListen) {return HR_IGNORE;}
  856. virtual EnHandleResult OnAccept(IUdpServer* pSender, CONNID dwConnID, UINT_PTR pSockAddr) {return HR_IGNORE;}
  857. virtual EnHandleResult OnHandShake(IUdpServer* pSender, CONNID dwConnID) {return HR_IGNORE;}
  858. virtual EnHandleResult OnReceive(IUdpServer* pSender, CONNID dwConnID, int iLength) {return HR_IGNORE;}
  859. virtual EnHandleResult OnSend(IUdpServer* pSender, CONNID dwConnID, const BYTE* pData, int iLength) {return HR_IGNORE;}
  860. virtual EnHandleResult OnShutdown(IUdpServer* pSender) {return HR_IGNORE;}
  861. };
  862. /************************************************************************
  863. 名称:通信代理 Socket 监听器接口
  864. 描述:定义 通信代理 Socket 监听器的所有事件
  865. ************************************************************************/
  866. template<class T> class IAgentListenerT : public IComplexSocketListenerT<T>
  867. {
  868. public:
  869. /*
  870. * 名称:准备连接通知
  871. * 描述:通信客户端组件启动时,在客户端 Socket 创建完成并开始执行连接前,Socket 监听
  872. * 器将收到该通知,监听器可以在通知处理方法中执行 Socket 选项设置等额外工作
  873. *
  874. * 参数: pSender -- 事件源对象
  875. * dwConnID -- 连接 ID
  876. * socket -- 客户端 Socket
  877. * 返回值: HR_OK / HR_IGNORE -- 继续执行
  878. * HR_ERROR -- 终止启动通信客户端组件
  879. */
  880. virtual EnHandleResult OnPrepareConnect(T* pSender, CONNID dwConnID, SOCKET socket) = 0;
  881. /*
  882. * 名称:连接完成通知
  883. * 描述:与服务端成功建立连接时,Socket 监听器将收到该通知
  884. *
  885. * 参数: pSender -- 事件源对象
  886. * dwConnID -- 连接 ID
  887. * 返回值: HR_OK / HR_IGNORE -- 继续执行
  888. * HR_ERROR -- 同步连接:终止启动通信客户端组件
  889. * 异步连接:关闭连接
  890. */
  891. virtual EnHandleResult OnConnect(T* pSender, CONNID dwConnID) = 0;
  892. };
  893. /************************************************************************
  894. 名称:TCP 通信代理 Socket 监听器接口
  895. 描述:定义 TCP 通信代理 Socket 监听器的所有事件
  896. ************************************************************************/
  897. class ITcpAgentListener : public IAgentListenerT<ITcpAgent>
  898. {
  899. public:
  900. };
  901. /************************************************************************
  902. 名称:PUSH 模型通信代理 Socket 监听器抽象基类
  903. 描述:定义某些事件的默认处理方法(忽略事件)
  904. ************************************************************************/
  905. class CTcpAgentListener : public ITcpAgentListener
  906. {
  907. public:
  908. virtual EnHandleResult OnPrepareConnect(ITcpAgent* pSender, CONNID dwConnID, SOCKET socket) {return HR_IGNORE;}
  909. virtual EnHandleResult OnConnect(ITcpAgent* pSender, CONNID dwConnID) {return HR_IGNORE;}
  910. virtual EnHandleResult OnHandShake(ITcpAgent* pSender, CONNID dwConnID) {return HR_IGNORE;}
  911. virtual EnHandleResult OnReceive(ITcpAgent* pSender, CONNID dwConnID, int iLength) {return HR_IGNORE;}
  912. virtual EnHandleResult OnSend(ITcpAgent* pSender, CONNID dwConnID, const BYTE* pData, int iLength) {return HR_IGNORE;}
  913. virtual EnHandleResult OnShutdown(ITcpAgent* pSender) {return HR_IGNORE;}
  914. };
  915. /************************************************************************
  916. 名称:PULL 通信代理 Socket 监听器抽象基类
  917. 描述:定义某些事件的默认处理方法(忽略事件)
  918. ************************************************************************/
  919. class CTcpPullAgentListener : public CTcpAgentListener
  920. {
  921. public:
  922. virtual EnHandleResult OnReceive(ITcpAgent* pSender, CONNID dwConnID, int iLength) = 0;
  923. virtual EnHandleResult OnReceive(ITcpAgent* pSender, CONNID dwConnID, const BYTE* pData, int iLength) {return HR_IGNORE;}
  924. };
  925. /************************************************************************
  926. 名称:客户端 Socket 监听器接口
  927. 描述:定义客户端 Socket 监听器的所有事件
  928. ************************************************************************/
  929. template<class T> class IClientListenerT : public ISocketListenerT<T>
  930. {
  931. public:
  932. /*
  933. * 名称:准备连接通知
  934. * 描述:通信客户端组件启动时,在客户端 Socket 创建完成并开始执行连接前,Socket 监听
  935. * 器将收到该通知,监听器可以在通知处理方法中执行 Socket 选项设置等额外工作
  936. *
  937. * 参数: pSender -- 事件源对象
  938. * dwConnID -- 连接 ID
  939. * socket -- 客户端 Socket
  940. * 返回值: HR_OK / HR_IGNORE -- 继续执行
  941. * HR_ERROR -- 终止启动通信客户端组件
  942. */
  943. virtual EnHandleResult OnPrepareConnect(T* pSender, CONNID dwConnID, SOCKET socket) = 0;
  944. /*
  945. * 名称:连接完成通知
  946. * 描述:与服务端成功建立连接时,Socket 监听器将收到该通知
  947. *
  948. * 参数: pSender -- 事件源对象
  949. * dwConnID -- 连接 ID
  950. * 返回值: HR_OK / HR_IGNORE -- 继续执行
  951. * HR_ERROR -- 同步连接:终止启动通信客户端组件
  952. * 异步连接:关闭连接
  953. */
  954. virtual EnHandleResult OnConnect(T* pSender, CONNID dwConnID) = 0;
  955. };
  956. /************************************************************************
  957. 名称:TCP 客户端 Socket 监听器接口
  958. 描述:定义 TCP 客户端 Socket 监听器的所有事件
  959. ************************************************************************/
  960. class ITcpClientListener : public IClientListenerT<ITcpClient>
  961. {
  962. public:
  963. };
  964. /************************************************************************
  965. 名称:PUSH 模型客户端 Socket 监听器抽象基类
  966. 描述:定义某些事件的默认处理方法(忽略事件)
  967. ************************************************************************/
  968. class CTcpClientListener : public ITcpClientListener
  969. {
  970. public:
  971. virtual EnHandleResult OnPrepareConnect(ITcpClient* pSender, CONNID dwConnID, SOCKET socket) {return HR_IGNORE;}
  972. virtual EnHandleResult OnConnect(ITcpClient* pSender, CONNID dwConnID) {return HR_IGNORE;}
  973. virtual EnHandleResult OnHandShake(ITcpClient* pSender, CONNID dwConnID) {return HR_IGNORE;}
  974. virtual EnHandleResult OnReceive(ITcpClient* pSender, CONNID dwConnID, int iLength) {return HR_IGNORE;}
  975. virtual EnHandleResult OnSend(ITcpClient* pSender, CONNID dwConnID, const BYTE* pData, int iLength) {return HR_IGNORE;}
  976. };
  977. /************************************************************************
  978. 名称:PULL 客户端 Socket 监听器抽象基类
  979. 描述:定义某些事件的默认处理方法(忽略事件)
  980. ************************************************************************/
  981. class CTcpPullClientListener : public CTcpClientListener
  982. {
  983. public:
  984. virtual EnHandleResult OnReceive(ITcpClient* pSender, CONNID dwConnID, int iLength) = 0;
  985. virtual EnHandleResult OnReceive(ITcpClient* pSender, CONNID dwConnID, const BYTE* pData, int iLength) {return HR_IGNORE;}
  986. };
  987. /************************************************************************
  988. 名称:UDP 客户端 Socket 监听器接口
  989. 描述:定义 UDP 客户端 Socket 监听器的所有事件
  990. ************************************************************************/
  991. class IUdpClientListener : public IClientListenerT<IUdpClient>
  992. {
  993. public:
  994. };
  995. /************************************************************************
  996. 名称:UDP 户端 Socket 监听器抽象基类
  997. 描述:定义某些事件的默认处理方法(忽略事件)
  998. ************************************************************************/
  999. class CUdpClientListener : public IUdpClientListener
  1000. {
  1001. public:
  1002. virtual EnHandleResult OnPrepareConnect(IUdpClient* pSender, CONNID dwConnID, SOCKET socket) {return HR_IGNORE;}
  1003. virtual EnHandleResult OnConnect(IUdpClient* pSender, CONNID dwConnID) {return HR_IGNORE;}
  1004. virtual EnHandleResult OnHandShake(IUdpClient* pSender, CONNID dwConnID) {return HR_IGNORE;}
  1005. virtual EnHandleResult OnReceive(IUdpClient* pSender, CONNID dwConnID, int iLength) {return HR_IGNORE;}
  1006. virtual EnHandleResult OnSend(IUdpClient* pSender, CONNID dwConnID, const BYTE* pData, int iLength) {return HR_IGNORE;}
  1007. };
  1008. /************************************************************************
  1009. 名称:UDP 传播 Socket 监听器接口
  1010. 描述:定义 UDP 传播 Socket 监听器的所有事件
  1011. ************************************************************************/
  1012. class IUdpCastListener : public IClientListenerT<IUdpCast>
  1013. {
  1014. public:
  1015. };
  1016. /************************************************************************
  1017. 名称:UDP 传播 Socket 监听器抽象基类
  1018. 描述:定义某些事件的默认处理方法(忽略事件)
  1019. ************************************************************************/
  1020. class CUdpCastListener : public IUdpCastListener
  1021. {
  1022. public:
  1023. virtual EnHandleResult OnPrepareConnect(IUdpCast* pSender, CONNID dwConnID, SOCKET socket) {return HR_IGNORE;}
  1024. virtual EnHandleResult OnConnect(IUdpCast* pSender, CONNID dwConnID) {return HR_IGNORE;}
  1025. virtual EnHandleResult OnHandShake(IUdpCast* pSender, CONNID dwConnID) {return HR_IGNORE;}
  1026. virtual EnHandleResult OnReceive(IUdpCast* pSender, CONNID dwConnID, int iLength) {return HR_IGNORE;}
  1027. virtual EnHandleResult OnSend(IUdpCast* pSender, CONNID dwConnID, const BYTE* pData, int iLength) {return HR_IGNORE;}
  1028. };
  1029. /*****************************************************************************************************************************************************/
  1030. /****************************************************************** HTTP Interfaces ******************************************************************/
  1031. /*****************************************************************************************************************************************************/
  1032. /************************************************************************
  1033. 名称:复合 Http 组件接口
  1034. 描述:定义复合 Http 组件的所有操作方法和属性访问方法,复合 Http 组件同时管理多个 Http 连接
  1035. ************************************************************************/
  1036. class IComplexHttp
  1037. {
  1038. public:
  1039. /***********************************************************************/
  1040. /***************************** 组件操作方法 *****************************/
  1041. /*
  1042. * 名称:发送 WebSocket 消息
  1043. * 描述:向对端端发送 WebSocket 消息
  1044. *
  1045. * 参数: dwConnID -- 连接 ID
  1046. * bFinal -- 是否结束帧
  1047. * iReserved -- RSV1/RSV2/RSV3 各 1 位
  1048. * iOperationCode -- 操作码:0x0 - 0xF
  1049. * lpszMask -- 掩码(nullptr 或 4 字节掩码,如果为 nullptr 则没有掩码)
  1050. * pData -- 消息体数据缓冲区
  1051. * iLength -- 消息体数据长度
  1052. * ullBodyLen -- 消息总长度
  1053. * ullBodyLen = 0 -> 消息总长度为 iLength
  1054. * ullBodyLen = iLength -> 消息总长度为 ullBodyLen
  1055. * ullBodyLen > iLength -> 消息总长度为 ullBodyLen,后续消息体长度为 ullBOdyLen - iLength,后续消息体通过底层方法 Send() / SendPackets() 发送
  1056. * ullBodyLen < iLength -> 错误参数,发送失败
  1057. * 返回值: TRUE -- 成功
  1058. * FALSE -- 失败
  1059. */
  1060. virtual BOOL SendWSMessage(CONNID dwConnID, BOOL bFinal, BYTE iReserved, BYTE iOperationCode, const BYTE lpszMask[4] = nullptr, BYTE* pData = nullptr, int iLength = 0, ULONGLONG ullBodyLen = 0) = 0;
  1061. public:
  1062. /***********************************************************************/
  1063. /***************************** 属性访问方法 *****************************/
  1064. /* 设置本地协议版本 */
  1065. virtual void SetLocalVersion(EnHttpVersion usVersion) = 0;
  1066. /* 获取本地协议版本 */
  1067. virtual EnHttpVersion GetLocalVersion() = 0;
  1068. /* 检查是否升级协议 */
  1069. virtual BOOL IsUpgrade(CONNID dwConnID) = 0;
  1070. /* 检查是否有 Keep-Alive 标识 */
  1071. virtual BOOL IsKeepAlive(CONNID dwConnID) = 0;
  1072. /* 获取协议版本 */
  1073. virtual USHORT GetVersion(CONNID dwConnID) = 0;
  1074. /* 获取内容长度 */
  1075. virtual ULONGLONG GetContentLength(CONNID dwConnID) = 0;
  1076. /* 获取内容类型 */
  1077. virtual LPCSTR GetContentType(CONNID dwConnID) = 0;
  1078. /* 获取内容编码 */
  1079. virtual LPCSTR GetContentEncoding(CONNID dwConnID) = 0;
  1080. /* 获取传输编码 */
  1081. virtual LPCSTR GetTransferEncoding(CONNID dwConnID) = 0;
  1082. /* 获取协议升级类型 */
  1083. virtual EnHttpUpgradeType GetUpgradeType(CONNID dwConnID) = 0;
  1084. /* 获取解析错误代码 */
  1085. virtual USHORT GetParseErrorCode(CONNID dwConnID, LPCSTR* lpszErrorDesc = nullptr) = 0;
  1086. /* 获取某个请求头(单值) */
  1087. virtual BOOL GetHeader(CONNID dwConnID, LPCSTR lpszName, LPCSTR* lpszValue) = 0;
  1088. /* 获取某个请求头(多值) */
  1089. virtual BOOL GetHeaders(CONNID dwConnID, LPCSTR lpszName, LPCSTR lpszValue[], DWORD& dwCount) = 0;
  1090. /* 获取所有请求头 */
  1091. virtual BOOL GetAllHeaders(CONNID dwConnID, THeader lpHeaders[], DWORD& dwCount) = 0;
  1092. /* 获取所有请求头名称 */
  1093. virtual BOOL GetAllHeaderNames(CONNID dwConnID, LPCSTR lpszName[], DWORD& dwCount) = 0;
  1094. /* 获取 Cookie */
  1095. virtual BOOL GetCookie(CONNID dwConnID, LPCSTR lpszName, LPCSTR* lpszValue) = 0;
  1096. /* 获取所有 Cookie */
  1097. virtual BOOL GetAllCookies(CONNID dwConnID, TCookie lpCookies[], DWORD& dwCount) = 0;
  1098. /*
  1099. // !! maybe implemented in future !! //
  1100. virtual BOOL GetParam(CONNID dwConnID, LPCSTR lpszName, LPCSTR* lpszValue) = 0;
  1101. virtual BOOL GetParams(CONNID dwConnID, LPCSTR lpszName, LPCSTR lpszValue[], DWORD& dwCount) = 0;
  1102. virtual BOOL GetAllParams(CONNID dwConnID, LPPARAM lpszParam[], DWORD& dwCount) = 0;
  1103. virtual BOOL GetAllParamNames(CONNID dwConnID, LPCSTR lpszName[], DWORD& dwCount) = 0;
  1104. */
  1105. /* 获取当前 WebSocket 消息状态,传入 nullptr 则不获取相应字段 */
  1106. virtual BOOL GetWSMessageState(CONNID dwConnID, BOOL* lpbFinal, BYTE* lpiReserved, BYTE* lpiOperationCode, LPCBYTE* lpszMask, ULONGLONG* lpullBodyLen, ULONGLONG* lpullBodyRemain) = 0;
  1107. public:
  1108. virtual ~IComplexHttp() {}
  1109. };
  1110. /************************************************************************
  1111. 名称:复合 Http 请求者组件接口
  1112. 描述:定义复合 Http 请求者组件的所有操作方法和属性访问方法
  1113. ************************************************************************/
  1114. class IComplexHttpRequester : public IComplexHttp
  1115. {
  1116. public:
  1117. /***********************************************************************/
  1118. /***************************** 组件操作方法 *****************************/
  1119. /*
  1120. * 名称:发送请求
  1121. * 描述:向服务端发送 HTTP 请求
  1122. *
  1123. * 参数: dwConnID -- 连接 ID
  1124. * lpszMethod -- 请求方法
  1125. * lpszPath -- 请求路径
  1126. * lpHeaders -- 请求头
  1127. * iHeaderCount -- 请求头数量
  1128. * pBody -- 请求体
  1129. * iLength -- 请求体长度
  1130. * 返回值: TRUE -- 成功
  1131. * FALSE -- 失败
  1132. */
  1133. virtual BOOL SendRequest(CONNID dwConnID, LPCSTR lpszMethod, LPCSTR lpszPath, const THeader lpHeaders[] = nullptr, int iHeaderCount = 0, const BYTE* pBody = nullptr, int iLength = 0) = 0;
  1134. /*
  1135. * 名称:发送本地文件
  1136. * 描述:向指定连接发送 4096 KB 以下的小文件
  1137. *
  1138. * 参数: dwConnID -- 连接 ID
  1139. * lpszFileName -- 文件路径
  1140. * lpszMethod -- 请求方法
  1141. * lpszPath -- 请求路径
  1142. * lpHeaders -- 请求头
  1143. * iHeaderCount -- 请求头数量
  1144. * 返回值: TRUE -- 成功
  1145. * FALSE -- 失败
  1146. */
  1147. virtual BOOL SendLocalFile(CONNID dwConnID, LPCSTR lpszFileName, LPCSTR lpszMethod, LPCSTR lpszPath, const THeader lpHeaders[] = nullptr, int iHeaderCount = 0) = 0;
  1148. /* 发送 POST 请求 */
  1149. virtual BOOL SendPost(CONNID dwConnID, LPCSTR lpszPath, const THeader lpHeaders[], int iHeaderCount, const BYTE* pBody, int iLength) = 0;
  1150. /* 发送 PUT 请求 */
  1151. virtual BOOL SendPut(CONNID dwConnID, LPCSTR lpszPath, const THeader lpHeaders[], int iHeaderCount, const BYTE* pBody, int iLength) = 0;
  1152. /* 发送 PATCH 请求 */
  1153. virtual BOOL SendPatch(CONNID dwConnID, LPCSTR lpszPath, const THeader lpHeaders[], int iHeaderCount, const BYTE* pBody, int iLength) = 0;
  1154. /* 发送 GET 请求 */
  1155. virtual BOOL SendGet(CONNID dwConnID, LPCSTR lpszPath, const THeader lpHeaders[] = nullptr, int iHeaderCount = 0) = 0;
  1156. /* 发送 DELETE 请求 */
  1157. virtual BOOL SendDelete(CONNID dwConnID, LPCSTR lpszPath, const THeader lpHeaders[] = nullptr, int iHeaderCount = 0) = 0;
  1158. /* 发送 HEAD 请求 */
  1159. virtual BOOL SendHead(CONNID dwConnID, LPCSTR lpszPath, const THeader lpHeaders[] = nullptr, int iHeaderCount = 0) = 0;
  1160. /* 发送 TRACE 请求 */
  1161. virtual BOOL SendTrace(CONNID dwConnID, LPCSTR lpszPath, const THeader lpHeaders[] = nullptr, int iHeaderCount = 0) = 0;
  1162. /* 发送 OPTIONS 请求 */
  1163. virtual BOOL SendOptions(CONNID dwConnID, LPCSTR lpszPath, const THeader lpHeaders[] = nullptr, int iHeaderCount = 0) = 0;
  1164. /* 发送 CONNECT 请求 */
  1165. virtual BOOL SendConnect(CONNID dwConnID, LPCSTR lpszHost, const THeader lpHeaders[] = nullptr, int iHeaderCount = 0) = 0;
  1166. public:
  1167. /***********************************************************************/
  1168. /***************************** 属性访问方法 *****************************/
  1169. /* 获取 HTTP 状态码 */
  1170. virtual USHORT GetStatusCode(CONNID dwConnID) = 0;
  1171. /* 添加 Cookie */
  1172. virtual BOOL AddCookie(CONNID dwConnID, LPCSTR lpszName, LPCSTR lpszValue, BOOL bRelpace = TRUE) = 0;
  1173. /* 删除 Cookie */
  1174. virtual BOOL DeleteCookie(CONNID dwConnID, LPCSTR lpszName) = 0;
  1175. /* 删除所有 Cookie */
  1176. virtual BOOL DeleteAllCookies(CONNID dwConnID) = 0;
  1177. };
  1178. /************************************************************************
  1179. 名称:复合 Http 响应者组件接口
  1180. 描述:定义复合 Http 响应者组件的所有操作方法和属性访问方法
  1181. ************************************************************************/
  1182. class IComplexHttpResponder : public IComplexHttp
  1183. {
  1184. public:
  1185. /***********************************************************************/
  1186. /***************************** 组件操作方法 *****************************/
  1187. /*
  1188. * 名称:回复请求
  1189. * 描述:向客户端回复 HTTP 请求
  1190. *
  1191. * 参数: dwConnID -- 连接 ID
  1192. * usStatusCode -- HTTP 状态码
  1193. * lpszDesc -- HTTP 状态描述
  1194. * lpHeaders -- 回复请求头
  1195. * iHeaderCount -- 回复请求头数量
  1196. * pData -- 回复请求体
  1197. * iLength -- 回复请求体长度
  1198. * 返回值: TRUE -- 成功
  1199. * FALSE -- 失败
  1200. */
  1201. 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;
  1202. /*
  1203. * 名称:发送本地文件
  1204. * 描述:向指定连接发送 4096 KB 以下的小文件
  1205. *
  1206. * 参数: dwConnID -- 连接 ID
  1207. * lpszFileName -- 文件路径
  1208. * usStatusCode -- HTTP 状态码
  1209. * lpszDesc -- HTTP 状态描述
  1210. * lpHeaders -- 回复请求头
  1211. * iHeaderCount -- 回复请求头数量
  1212. * 返回值: TRUE -- 成功
  1213. * FALSE -- 失败
  1214. */
  1215. virtual BOOL SendLocalFile(CONNID dwConnID, LPCSTR lpszFileName, USHORT usStatusCode = HSC_OK, LPCSTR lpszDesc = nullptr, const THeader lpHeaders[] = nullptr, int iHeaderCount = 0) = 0;
  1216. /*
  1217. * 名称:释放连接
  1218. * 描述:把连接放入释放队列,等待某个时间(通过 SetReleaseDelay() 设置)关闭连接
  1219. *
  1220. * 参数: dwConnID -- 连接 ID
  1221. * 返回值: TRUE -- 成功
  1222. * FALSE -- 失败
  1223. */
  1224. virtual BOOL Release(CONNID dwConnID) = 0;
  1225. public:
  1226. /***********************************************************************/
  1227. /***************************** 属性访问方法 *****************************/
  1228. /* 获取主机 */
  1229. virtual LPCSTR GetHost(CONNID dwConnID) = 0;
  1230. /* 设置连接释放延时(默认:3000 毫秒) */
  1231. virtual void SetReleaseDelay(DWORD dwReleaseDelay) = 0;
  1232. /* 获取连接释放延时 */
  1233. virtual DWORD GetReleaseDelay() = 0;
  1234. /* 获取请求行 URL 域掩码(URL 域参考:EnHttpUrlField) */
  1235. virtual USHORT GetUrlFieldSet(CONNID dwConnID) = 0;
  1236. /* 获取某个 URL 域值 */
  1237. virtual LPCSTR GetUrlField(CONNID dwConnID, EnHttpUrlField enField) = 0;
  1238. /* 获取请求方法 */
  1239. virtual LPCSTR GetMethod(CONNID dwConnID) = 0;
  1240. };
  1241. /************************************************************************
  1242. 名称:简单 HTTP 组件接口
  1243. 描述:定义 简单 HTTP 组件的所有操作方法和属性访问方法
  1244. ************************************************************************/
  1245. class IHttp
  1246. {
  1247. public:
  1248. /***********************************************************************/
  1249. /***************************** 组件操作方法 *****************************/
  1250. /*
  1251. * 名称:发送 WebSocket 消息
  1252. * 描述:向对端端发送 WebSocket 消息
  1253. *
  1254. * 参数: bFinal -- 是否结束帧
  1255. * iReserved -- RSV1/RSV2/RSV3 各 1 位
  1256. * iOperationCode -- 操作码:0x0 - 0xF
  1257. * lpszMask -- 掩码(nullptr 或 4 字节掩码,如果为 nullptr 则没有掩码)
  1258. * pData -- 消息体数据缓冲区
  1259. * iLength -- 消息体数据长度
  1260. * ullBodyLen -- 消息总长度
  1261. * ullBodyLen = 0 -> 消息总长度为 iLength
  1262. * ullBodyLen = iLength -> 消息总长度为 ullBodyLen
  1263. * ullBodyLen > iLength -> 消息总长度为 ullBodyLen,后续消息体长度为 ullBOdyLen - iLength,后续消息体通过底层方法 Send() / SendPackets() 发送
  1264. * ullBodyLen < iLength -> 错误参数,发送失败
  1265. * 返回值: TRUE -- 成功
  1266. * FALSE -- 失败
  1267. */
  1268. virtual BOOL SendWSMessage(BOOL bFinal, BYTE iReserved, BYTE iOperationCode, const BYTE lpszMask[4] = nullptr, BYTE* pData = nullptr, int iLength = 0, ULONGLONG ullBodyLen = 0) = 0;
  1269. public:
  1270. /***********************************************************************/
  1271. /***************************** 属性访问方法 *****************************/
  1272. /* 设置本地协议版本 */
  1273. virtual void SetLocalVersion(EnHttpVersion usVersion) = 0;
  1274. /* 获取本地协议版本 */
  1275. virtual EnHttpVersion GetLocalVersion() = 0;
  1276. /* 检查是否升级协议 */
  1277. virtual BOOL IsUpgrade() = 0;
  1278. /* 检查是否有 Keep-Alive 标识 */
  1279. virtual BOOL IsKeepAlive() = 0;
  1280. /* 获取协议版本 */
  1281. virtual USHORT GetVersion() = 0;
  1282. /* 获取内容长度 */
  1283. virtual ULONGLONG GetContentLength() = 0;
  1284. /* 获取内容类型 */
  1285. virtual LPCSTR GetContentType() = 0;
  1286. /* 获取内容编码 */
  1287. virtual LPCSTR GetContentEncoding() = 0;
  1288. /* 获取传输编码 */
  1289. virtual LPCSTR GetTransferEncoding() = 0;
  1290. /* 获取协议升级类型 */
  1291. virtual EnHttpUpgradeType GetUpgradeType() = 0;
  1292. /* 获取解析错误代码 */
  1293. virtual USHORT GetParseErrorCode(LPCSTR* lpszErrorDesc = nullptr) = 0;
  1294. /* 获取 HTTP 状态码 */
  1295. virtual USHORT GetStatusCode() = 0;
  1296. /* 获取某个请求头(单值) */
  1297. virtual BOOL GetHeader(LPCSTR lpszName, LPCSTR* lpszValue) = 0;
  1298. /* 获取某个请求头(多值) */
  1299. virtual BOOL GetHeaders(LPCSTR lpszName, LPCSTR lpszValue[], DWORD& dwCount) = 0;
  1300. /* 获取所有请求头 */
  1301. virtual BOOL GetAllHeaders(THeader lpHeaders[], DWORD& dwCount) = 0;
  1302. /* 获取所有请求头名称 */
  1303. virtual BOOL GetAllHeaderNames(LPCSTR lpszName[], DWORD& dwCount) = 0;
  1304. /* 获取 Cookie */
  1305. virtual BOOL GetCookie(LPCSTR lpszName, LPCSTR* lpszValue) = 0;
  1306. /* 获取所有 Cookie */
  1307. virtual BOOL GetAllCookies(TCookie lpCookies[], DWORD& dwCount) = 0;
  1308. /* 添加 Cookie */
  1309. virtual BOOL AddCookie(LPCSTR lpszName, LPCSTR lpszValue, BOOL bRelpace = TRUE) = 0;
  1310. /* 删除 Cookie */
  1311. virtual BOOL DeleteCookie(LPCSTR lpszName) = 0;
  1312. /* 删除所有 Cookie */
  1313. virtual BOOL DeleteAllCookies() = 0;
  1314. /*
  1315. // !! maybe implemented in future !! //
  1316. virtual BOOL GetParam(LPCSTR lpszName, LPCSTR* lpszValue) = 0;
  1317. virtual BOOL GetParams(LPCSTR lpszName, LPCSTR lpszValue[], DWORD& dwCount) = 0;
  1318. virtual BOOL GetAllParams(LPPARAM lpszParam[], DWORD& dwCount) = 0;
  1319. virtual BOOL GetAllParamNames(LPCSTR lpszName[], DWORD& dwCount) = 0;
  1320. */
  1321. /* 获取当前 WebSocket 消息状态,传入 nullptr 则不获取相应字段 */
  1322. virtual BOOL GetWSMessageState(BOOL* lpbFinal, BYTE* lpiReserved, BYTE* lpiOperationCode, LPCBYTE* lpszMask, ULONGLONG* lpullBodyLen, ULONGLONG* lpullBodyRemain) = 0;
  1323. public:
  1324. virtual ~IHttp() {}
  1325. };
  1326. /************************************************************************
  1327. 名称:简单 Http 请求者组件接口
  1328. 描述:定义简单 Http 请求者组件的所有操作方法和属性访问方法
  1329. ************************************************************************/
  1330. class IHttpRequester : public IHttp
  1331. {
  1332. public:
  1333. /***********************************************************************/
  1334. /***************************** 组件操作方法 *****************************/
  1335. /*
  1336. * 名称:发送请求
  1337. * 描述:向服务端发送 HTTP 请求
  1338. *
  1339. * 参数: lpszMethod -- 请求方法
  1340. * lpszPath -- 请求路径
  1341. * lpHeaders -- 请求头
  1342. * iHeaderCount -- 请求头数量
  1343. * pBody -- 请求体
  1344. * iLength -- 请求体长度
  1345. * 返回值: TRUE -- 成功
  1346. * FALSE -- 失败
  1347. */
  1348. virtual BOOL SendRequest(LPCSTR lpszMethod, LPCSTR lpszPath, const THeader lpHeaders[] = nullptr, int iHeaderCount = 0, const BYTE* pBody = nullptr, int iLength = 0) = 0;
  1349. /*
  1350. * 名称:发送本地文件
  1351. * 描述:向指定连接发送 4096 KB 以下的小文件
  1352. *
  1353. * 参数: dwConnID -- 连接 ID
  1354. * lpszFileName -- 文件路径
  1355. * lpszMethod -- 请求方法
  1356. * lpszPath -- 请求路径
  1357. * lpHeaders -- 请求头
  1358. * iHeaderCount -- 请求头数量
  1359. * 返回值: TRUE -- 成功
  1360. * FALSE -- 失败
  1361. */
  1362. virtual BOOL SendLocalFile(LPCSTR lpszFileName, LPCSTR lpszMethod, LPCSTR lpszPath, const THeader lpHeaders[] = nullptr, int iHeaderCount = 0) = 0;
  1363. /* 发送 POST 请求 */
  1364. virtual BOOL SendPost(LPCSTR lpszPath, const THeader lpHeaders[], int iHeaderCount, const BYTE* pBody, int iLength) = 0;
  1365. /* 发送 PUT 请求 */
  1366. virtual BOOL SendPut(LPCSTR lpszPath, const THeader lpHeaders[], int iHeaderCount, const BYTE* pBody, int iLength) = 0;
  1367. /* 发送 PATCH 请求 */
  1368. virtual BOOL SendPatch(LPCSTR lpszPath, const THeader lpHeaders[], int iHeaderCount, const BYTE* pBody, int iLength) = 0;
  1369. /* 发送 GET 请求 */
  1370. virtual BOOL SendGet(LPCSTR lpszPath, const THeader lpHeaders[] = nullptr, int iHeaderCount = 0) = 0;
  1371. /* 发送 DELETE 请求 */
  1372. virtual BOOL SendDelete(LPCSTR lpszPath, const THeader lpHeaders[] = nullptr, int iHeaderCount = 0) = 0;
  1373. /* 发送 HEAD 请求 */
  1374. virtual BOOL SendHead(LPCSTR lpszPath, const THeader lpHeaders[] = nullptr, int iHeaderCount = 0) = 0;
  1375. /* 发送 TRACE 请求 */
  1376. virtual BOOL SendTrace(LPCSTR lpszPath, const THeader lpHeaders[] = nullptr, int iHeaderCount = 0) = 0;
  1377. /* 发送 OPTIONS 请求 */
  1378. virtual BOOL SendOptions(LPCSTR lpszPath, const THeader lpHeaders[] = nullptr, int iHeaderCount = 0) = 0;
  1379. /* 发送 CONNECT 请求 */
  1380. virtual BOOL SendConnect(LPCSTR lpszHost, const THeader lpHeaders[] = nullptr, int iHeaderCount = 0) = 0;
  1381. public:
  1382. /***********************************************************************/
  1383. /***************************** 属性访问方法 *****************************/
  1384. };
  1385. /************************************************************************
  1386. 名称:简单 Http 同步请求者组件接口
  1387. 描述:定义简单 Http 同步请求者组件的所有操作方法和属性访问方法
  1388. ************************************************************************/
  1389. class IHttpSyncRequester : public IHttpRequester
  1390. {
  1391. public:
  1392. /*
  1393. * 名称:发送 URL 请求
  1394. * 描述:向服务端发送 HTTP URL 请求
  1395. *
  1396. * 参数: lpszMethod -- 请求方法
  1397. * lpszUrl -- 请求 URL
  1398. * lpHeaders -- 请求头
  1399. * iHeaderCount -- 请求头数量
  1400. * pBody -- 请求体
  1401. * iLength -- 请求体长度
  1402. * bForceReconnect -- 强制重新连接(默认:FALSE,当请求 URL 的主机和端口与现有连接一致时,重用现有连接)
  1403. * 返回值: TRUE -- 成功
  1404. * FALSE -- 失败
  1405. */
  1406. 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;
  1407. /***********************************************************************/
  1408. /***************************** 组件操作方法 *****************************/
  1409. /*
  1410. * 名称:清除请求结果
  1411. * 描述:清除上一次请求的响应头和响应体等结果信息(该方法会在每次发送请求前自动调用)
  1412. *
  1413. * 参数:
  1414. * 返回值: TRUE -- 成功
  1415. * FALSE -- 失败
  1416. */
  1417. virtual BOOL CleanupRequestResult () = 0;
  1418. public:
  1419. /***********************************************************************/
  1420. /***************************** 属性访问方法 *****************************/
  1421. /* 设置连接超时(毫秒,0:系统默认超时,默认:5000) */
  1422. virtual void SetConnectTimeout (DWORD dwConnectTimeout) = 0;
  1423. /* 设置请求超时(毫秒,0:无限等待,默认:10000) */
  1424. virtual void SetRequestTimeout (DWORD dwRequestTimeout) = 0;
  1425. /* 获取连接超时 */
  1426. virtual DWORD GetConnectTimeout () = 0;
  1427. /* 获取请求超时 */
  1428. virtual DWORD GetRequestTimeout () = 0;
  1429. /* 获取响应体 */
  1430. virtual BOOL GetResponseBody (LPCBYTE* lpszBody, int* iLength) = 0;
  1431. };
  1432. /************************************************************************
  1433. 名称:HTTP 组件接口
  1434. 描述:继承了 HTTP 和 Socket 接口
  1435. ************************************************************************/
  1436. typedef DualInterface<IComplexHttpResponder, ITcpServer> IHttpServer;
  1437. typedef DualInterface<IComplexHttpRequester, ITcpAgent> IHttpAgent;
  1438. typedef DualInterface<IHttpRequester, ITcpClient> IHttpClient;
  1439. typedef DualInterface<IHttpSyncRequester, ITcpClient> IHttpSyncClient;
  1440. /************************************************************************
  1441. 名称:IComplexHttp 组件监听器基接口
  1442. 描述:定义 IComplexHttp 组件监听器的所有事件
  1443. ************************************************************************/
  1444. template<class T> class IHttpListenerT
  1445. {
  1446. public:
  1447. /*
  1448. * 名称:开始解析通知
  1449. * 描述:开始解析 HTTP 报文时,向监听器发送该通知
  1450. *
  1451. * 参数: pSender -- 事件源对象
  1452. * dwConnID -- 连接 ID
  1453. * 返回值: HPR_OK -- 继续执行
  1454. * HPR_ERROR -- 引发 OnParserError() 和 OnClose() 事件并关闭连接
  1455. */
  1456. virtual EnHttpParseResult OnMessageBegin(T* pSender, CONNID dwConnID) = 0;
  1457. /*
  1458. * 名称:请求行解析完成通知(仅用于 HTTP 服务端)
  1459. * 描述:请求行解析完成后,向监听器发送该通知
  1460. *
  1461. * 参数: pSender -- 事件源对象
  1462. * dwConnID -- 连接 ID
  1463. * lpszMethod -- 请求方法名
  1464. * lpszUrl -- 请求行中的 URL 域
  1465. * 返回值: HPR_OK -- 继续执行
  1466. * HPR_ERROR -- 引发 OnParserError() 和 OnClose() 事件并关闭连接
  1467. */
  1468. virtual EnHttpParseResult OnRequestLine(T* pSender, CONNID dwConnID, LPCSTR lpszMethod, LPCSTR lpszUrl) = 0;
  1469. /*
  1470. * 名称:状态行解析完成通知(仅用于 HTTP 客户端)
  1471. * 描述:状态行解析完成后,向监听器发送该通知
  1472. *
  1473. * 参数: pSender -- 事件源对象
  1474. * dwConnID -- 连接 ID
  1475. * usStatusCode -- HTTP 状态码
  1476. * lpszDesc -- 状态描述
  1477. * 返回值: HPR_OK -- 继续执行
  1478. * HPR_ERROR -- 引发 OnParserError() 和 OnClose() 事件并关闭连接
  1479. */
  1480. virtual EnHttpParseResult OnStatusLine(T* pSender, CONNID dwConnID, USHORT usStatusCode, LPCSTR lpszDesc) = 0;
  1481. /*
  1482. * 名称:请求头通知
  1483. * 描述:每当解析完成一个请求头后,向监听器发送该通知
  1484. *
  1485. * 参数: pSender -- 事件源对象
  1486. * dwConnID -- 连接 ID
  1487. * lpszName -- 请求头名称
  1488. * lpszValue -- 请求头值
  1489. * 返回值: HPR_OK -- 继续执行
  1490. * HPR_ERROR -- 引发 OnParserError() 和 OnClose() 事件并关闭连接
  1491. */
  1492. virtual EnHttpParseResult OnHeader(T* pSender, CONNID dwConnID, LPCSTR lpszName, LPCSTR lpszValue) = 0;
  1493. /*
  1494. * 名称:请求头完成通知
  1495. * 描述:解析完成所有请求头后,向监听器发送该通知
  1496. *
  1497. * 参数: pSender -- 事件源对象
  1498. * dwConnID -- 连接 ID
  1499. * 返回值: HPR_OK -- 继续执行
  1500. * HPR_SKIP_BODY -- 跳过当前请求的 HTTP BODY
  1501. * HPR_UPGRADE -- 升级协议
  1502. * HPR_ERROR -- 引发 OnParserError() 和 OnClose() 事件并关闭连接
  1503. */
  1504. virtual EnHttpParseResult OnHeadersComplete(T* pSender, CONNID dwConnID) = 0;
  1505. /*
  1506. * 名称:BODY 报文通知
  1507. * 描述:每当接收到 HTTP BODY 报文,向监听器发送该通知
  1508. *
  1509. * 参数: pSender -- 事件源对象
  1510. * dwConnID -- 连接 ID
  1511. * pData -- 数据缓冲区
  1512. * iLength -- 数据长度
  1513. * 返回值: HPR_OK -- 继续执行
  1514. * HPR_ERROR -- 引发 OnParserError() 和 OnClose() 事件并关闭连接
  1515. */
  1516. virtual EnHttpParseResult OnBody(T* pSender, CONNID dwConnID, const BYTE* pData, int iLength) = 0;
  1517. /*
  1518. * 名称:Chunked 报文头通知
  1519. * 描述:每当解析出一个 Chunked 报文头,向监听器发送该通知
  1520. *
  1521. * 参数: pSender -- 事件源对象
  1522. * dwConnID -- 连接 ID
  1523. * iLength -- Chunked 报文体数据长度
  1524. * 返回值: HPR_OK -- 继续执行
  1525. * HPR_ERROR -- 引发 OnParserError() 和 OnClose() 事件并关闭连接
  1526. */
  1527. virtual EnHttpParseResult OnChunkHeader(T* pSender, CONNID dwConnID, int iLength) = 0;
  1528. /*
  1529. * 名称:Chunked 报文结束通知
  1530. * 描述:每当解析完一个 Chunked 报文,向监听器发送该通知
  1531. *
  1532. * 参数: pSender -- 事件源对象
  1533. * dwConnID -- 连接 ID
  1534. * 返回值: HPR_OK -- 继续执行
  1535. * HPR_ERROR -- 引发 OnParserError() 和 OnClose() 事件并关闭连接
  1536. */
  1537. virtual EnHttpParseResult OnChunkComplete(T* pSender, CONNID dwConnID) = 0;
  1538. /*
  1539. * 名称:完成解析通知
  1540. * 描述:每当解析完成一个完整 HTTP 报文,向监听器发送该通知
  1541. *
  1542. * 参数: pSender -- 事件源对象
  1543. * dwConnID -- 连接 ID
  1544. * 返回值: HPR_OK -- 继续执行
  1545. * HPR_ERROR -- 引发 OnParserError() 和 OnClose() 事件并关闭连接
  1546. */
  1547. virtual EnHttpParseResult OnMessageComplete(T* pSender, CONNID dwConnID) = 0;
  1548. /*
  1549. * 名称:升级协议通知
  1550. * 描述:当需要升级协议时,向监听器发送该通知
  1551. *
  1552. * 参数: pSender -- 事件源对象
  1553. * dwConnID -- 连接 ID
  1554. * enUpgradeType -- 协议类型
  1555. * 返回值: HPR_OK -- 继续执行
  1556. * HPR_ERROR -- 引发 OnClose() 事件并关闭连接
  1557. */
  1558. virtual EnHttpParseResult OnUpgrade(T* pSender, CONNID dwConnID, EnHttpUpgradeType enUpgradeType) = 0;
  1559. /*
  1560. * 名称:解析错误通知
  1561. * 描述:当解析 HTTP 报文错误时,向监听器发送该通知
  1562. *
  1563. * 参数: pSender -- 事件源对象
  1564. * dwConnID -- 连接 ID
  1565. * iErrorCode -- 错误代码
  1566. * lpszErrorDesc -- 错误描述
  1567. * 返回值: HPR_OK -- 继续执行
  1568. * HPR_ERROR -- 引发 OnClose() 事件并关闭连接
  1569. */
  1570. virtual EnHttpParseResult OnParseError(T* pSender, CONNID dwConnID, int iErrorCode, LPCSTR lpszErrorDesc) = 0;
  1571. /*
  1572. * 名称:WebSocket 数据包头通知
  1573. * 描述:当解析 WebSocket 数据包头时,向监听器发送该通知
  1574. *
  1575. * 参数: pSender -- 事件源对象
  1576. * dwConnID -- 连接 ID
  1577. * bFinal -- 是否结束帧
  1578. * iReserved -- RSV1/RSV2/RSV3 各 1 位
  1579. * iOperationCode -- 操作码:0x0 - 0xF
  1580. * lpszMask -- 掩码(nullptr 或 4 字节掩码,如果为 nullptr 则没有掩码)
  1581. * ullBodyLen -- 消息体长度
  1582. * 返回值: HR_OK / HR_IGNORE -- 继续执行
  1583. * HR_ERROR -- 引发 OnClose() 事件并关闭连接
  1584. */
  1585. virtual EnHandleResult OnWSMessageHeader(T* pSender, CONNID dwConnID, BOOL bFinal, BYTE iReserved, BYTE iOperationCode, const BYTE lpszMask[4], ULONGLONG ullBodyLen) = 0;
  1586. /*
  1587. * 名称:WebSocket 数据包体通知
  1588. * 描述:当接收到 WebSocket 数据包体时,向监听器发送该通知
  1589. *
  1590. * 参数: pSender -- 事件源对象
  1591. * dwConnID -- 连接 ID
  1592. * pData -- 消息体数据缓冲区
  1593. * iLength -- 消息体数据长度
  1594. * 返回值: HR_OK / HR_IGNORE -- 继续执行
  1595. * HR_ERROR -- 引发 OnClose() 事件并关闭连接
  1596. */
  1597. virtual EnHandleResult OnWSMessageBody(T* pSender, CONNID dwConnID, const BYTE* pData, int iLength) = 0;
  1598. /*
  1599. * 名称:WebSocket 数据包完成通知
  1600. * 描述:当完整接收一个 WebSocket 数据包时,向监听器发送该通知
  1601. *
  1602. * 参数: pSender -- 事件源对象
  1603. * dwConnID -- 连接 ID
  1604. * 返回值: HR_OK / HR_IGNORE -- 继续执行
  1605. * HR_ERROR -- 引发 OnClose() 事件并关闭连接
  1606. */
  1607. virtual EnHandleResult OnWSMessageComplete(T* pSender, CONNID dwConnID) = 0;
  1608. public:
  1609. virtual ~IHttpListenerT() {}
  1610. };
  1611. /************************************************************************
  1612. 名称:IHttpServer 组件端监听器接口
  1613. 描述:定义 IHttpServer 监听器的所有事件
  1614. ************************************************************************/
  1615. class IHttpServerListener : public IHttpListenerT<IHttpServer>, public ITcpServerListener
  1616. {
  1617. public:
  1618. };
  1619. /************************************************************************
  1620. 名称:IHttpAgent 组件端监听器接口
  1621. 描述:定义 IHttpAgent 监听器的所有事件
  1622. ************************************************************************/
  1623. class IHttpAgentListener : public IHttpListenerT<IHttpAgent>, public ITcpAgentListener
  1624. {
  1625. public:
  1626. };
  1627. /************************************************************************
  1628. 名称:IHttpClient 组件端监听器接口
  1629. 描述:定义 IHttpClient 监听器的所有事件
  1630. ************************************************************************/
  1631. class IHttpClientListener : public IHttpListenerT<IHttpClient>, public ITcpClientListener
  1632. {
  1633. public:
  1634. };
  1635. /************************************************************************
  1636. 名称:IHttpServerListener 监听器抽象基类
  1637. 描述:定义某些事件的默认处理方法(忽略事件)
  1638. ************************************************************************/
  1639. class CHttpServerListener : public IHttpServerListener
  1640. {
  1641. public:
  1642. virtual EnHandleResult OnPrepareListen(ITcpServer* pSender, SOCKET soListen) {return HR_IGNORE;}
  1643. virtual EnHandleResult OnAccept(ITcpServer* pSender, CONNID dwConnID, UINT_PTR soClient) {return HR_IGNORE;}
  1644. virtual EnHandleResult OnHandShake(ITcpServer* pSender, CONNID dwConnID) {return HR_IGNORE;}
  1645. virtual EnHandleResult OnReceive(ITcpServer* pSender, CONNID dwConnID, int iLength) {return HR_IGNORE;}
  1646. virtual EnHandleResult OnReceive(ITcpServer* pSender, CONNID dwConnID, const BYTE* pData, int iLength) {return HR_IGNORE;}
  1647. virtual EnHandleResult OnSend(ITcpServer* pSender, CONNID dwConnID, const BYTE* pData, int iLength) {return HR_IGNORE;}
  1648. virtual EnHandleResult OnShutdown(ITcpServer* pSender) {return HR_IGNORE;}
  1649. virtual EnHttpParseResult OnMessageBegin(IHttpServer* pSender, CONNID dwConnID) {return HPR_OK;}
  1650. virtual EnHttpParseResult OnRequestLine(IHttpServer* pSender, CONNID dwConnID, LPCSTR lpszMethod, LPCSTR lpszUrl) {return HPR_OK;}
  1651. virtual EnHttpParseResult OnStatusLine(IHttpServer* pSender, CONNID dwConnID, USHORT usStatusCode, LPCSTR lpszDesc) {return HPR_OK;}
  1652. virtual EnHttpParseResult OnHeader(IHttpServer* pSender, CONNID dwConnID, LPCSTR lpszName, LPCSTR lpszValue) {return HPR_OK;}
  1653. virtual EnHttpParseResult OnChunkHeader(IHttpServer* pSender, CONNID dwConnID, int iLength) {return HPR_OK;}
  1654. virtual EnHttpParseResult OnChunkComplete(IHttpServer* pSender, CONNID dwConnID) {return HPR_OK;}
  1655. virtual EnHttpParseResult OnUpgrade(IHttpServer* pSender, CONNID dwConnID, EnHttpUpgradeType enUpgradeType) {return HPR_OK;}
  1656. virtual EnHandleResult OnWSMessageHeader(IHttpServer* pSender, CONNID dwConnID, BOOL bFinal, BYTE iReserved, BYTE iOperationCode, const BYTE lpszMask[4], ULONGLONG ullBodyLen) {return HR_IGNORE;}
  1657. virtual EnHandleResult OnWSMessageBody(IHttpServer* pSender, CONNID dwConnID, const BYTE* pData, int iLength) {return HR_IGNORE;}
  1658. virtual EnHandleResult OnWSMessageComplete(IHttpServer* pSender, CONNID dwConnID) {return HR_IGNORE;}
  1659. };
  1660. /************************************************************************
  1661. 名称:IHttpAgentListener 监听器抽象基类
  1662. 描述:定义某些事件的默认处理方法(忽略事件)
  1663. ************************************************************************/
  1664. class CHttpAgentListener : public IHttpAgentListener
  1665. {
  1666. public:
  1667. virtual EnHandleResult OnPrepareConnect(ITcpAgent* pSender, CONNID dwConnID, SOCKET socket) {return HR_IGNORE;}
  1668. virtual EnHandleResult OnConnect(ITcpAgent* pSender, CONNID dwConnID) {return HR_IGNORE;}
  1669. virtual EnHandleResult OnHandShake(ITcpAgent* pSender, CONNID dwConnID) {return HR_IGNORE;}
  1670. virtual EnHandleResult OnReceive(ITcpAgent* pSender, CONNID dwConnID, int iLength) {return HR_IGNORE;}
  1671. virtual EnHandleResult OnReceive(ITcpAgent* pSender, CONNID dwConnID, const BYTE* pData, int iLength) {return HR_IGNORE;}
  1672. virtual EnHandleResult OnSend(ITcpAgent* pSender, CONNID dwConnID, const BYTE* pData, int iLength) {return HR_IGNORE;}
  1673. virtual EnHandleResult OnShutdown(ITcpAgent* pSender) {return HR_IGNORE;}
  1674. virtual EnHttpParseResult OnMessageBegin(IHttpAgent* pSender, CONNID dwConnID) {return HPR_OK;}
  1675. virtual EnHttpParseResult OnRequestLine(IHttpAgent* pSender, CONNID dwConnID, LPCSTR lpszMethod, LPCSTR lpszUrl) {return HPR_OK;}
  1676. virtual EnHttpParseResult OnStatusLine(IHttpAgent* pSender, CONNID dwConnID, USHORT usStatusCode, LPCSTR lpszDesc) {return HPR_OK;}
  1677. virtual EnHttpParseResult OnHeader(IHttpAgent* pSender, CONNID dwConnID, LPCSTR lpszName, LPCSTR lpszValue) {return HPR_OK;}
  1678. virtual EnHttpParseResult OnChunkHeader(IHttpAgent* pSender, CONNID dwConnID, int iLength) {return HPR_OK;}
  1679. virtual EnHttpParseResult OnChunkComplete(IHttpAgent* pSender, CONNID dwConnID) {return HPR_OK;}
  1680. virtual EnHttpParseResult OnUpgrade(IHttpAgent* pSender, CONNID dwConnID, EnHttpUpgradeType enUpgradeType) {return HPR_OK;}
  1681. virtual EnHandleResult OnWSMessageHeader(IHttpAgent* pSender, CONNID dwConnID, BOOL bFinal, BYTE iReserved, BYTE iOperationCode, const BYTE lpszMask[4], ULONGLONG ullBodyLen) {return HR_IGNORE;}
  1682. virtual EnHandleResult OnWSMessageBody(IHttpAgent* pSender, CONNID dwConnID, const BYTE* pData, int iLength) {return HR_IGNORE;}
  1683. virtual EnHandleResult OnWSMessageComplete(IHttpAgent* pSender, CONNID dwConnID) {return HR_IGNORE;}
  1684. };
  1685. /************************************************************************
  1686. 名称:IHttpClientListener 监听器抽象基类
  1687. 描述:定义某些事件的默认处理方法(忽略事件)
  1688. ************************************************************************/
  1689. class CHttpClientListener : public IHttpClientListener
  1690. {
  1691. public:
  1692. virtual EnHandleResult OnPrepareConnect(ITcpClient* pSender, CONNID dwConnID, SOCKET socket) {return HR_IGNORE;}
  1693. virtual EnHandleResult OnConnect(ITcpClient* pSender, CONNID dwConnID) {return HR_IGNORE;}
  1694. virtual EnHandleResult OnHandShake(ITcpClient* pSender, CONNID dwConnID) {return HR_IGNORE;}
  1695. virtual EnHandleResult OnReceive(ITcpClient* pSender, CONNID dwConnID, int iLength) {return HR_IGNORE;}
  1696. virtual EnHandleResult OnReceive(ITcpClient* pSender, CONNID dwConnID, const BYTE* pData, int iLength) {return HR_IGNORE;}
  1697. virtual EnHandleResult OnSend(ITcpClient* pSender, CONNID dwConnID, const BYTE* pData, int iLength) {return HR_IGNORE;}
  1698. virtual EnHttpParseResult OnMessageBegin(IHttpClient* pSender, CONNID dwConnID) {return HPR_OK;}
  1699. virtual EnHttpParseResult OnRequestLine(IHttpClient* pSender, CONNID dwConnID, LPCSTR lpszMethod, LPCSTR lpszUrl) {return HPR_OK;}
  1700. virtual EnHttpParseResult OnStatusLine(IHttpClient* pSender, CONNID dwConnID, USHORT usStatusCode, LPCSTR lpszDesc) {return HPR_OK;}
  1701. virtual EnHttpParseResult OnHeader(IHttpClient* pSender, CONNID dwConnID, LPCSTR lpszName, LPCSTR lpszValue) {return HPR_OK;}
  1702. virtual EnHttpParseResult OnChunkHeader(IHttpClient* pSender, CONNID dwConnID, int iLength) {return HPR_OK;}
  1703. virtual EnHttpParseResult OnChunkComplete(IHttpClient* pSender, CONNID dwConnID) {return HPR_OK;}
  1704. virtual EnHttpParseResult OnUpgrade(IHttpClient* pSender, CONNID dwConnID, EnHttpUpgradeType enUpgradeType) {return HPR_OK;}
  1705. virtual EnHandleResult OnWSMessageHeader(IHttpClient* pSender, CONNID dwConnID, BOOL bFinal, BYTE iReserved, BYTE iOperationCode, const BYTE lpszMask[4], ULONGLONG ullBodyLen) {return HR_IGNORE;}
  1706. virtual EnHandleResult OnWSMessageBody(IHttpClient* pSender, CONNID dwConnID, const BYTE* pData, int iLength) {return HR_IGNORE;}
  1707. virtual EnHandleResult OnWSMessageComplete(IHttpClient* pSender, CONNID dwConnID) {return HR_IGNORE;}
  1708. };