SocketInterface.h 74 KB

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