SocketInterface.h 77 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985
  1. /*
  2. * Copyright: JessMA Open Source (ldcsaa@gmail.com)
  3. *
  4. * Version : 4.2.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. 名称:复合 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. /* 检测是否为安全连接(SSL/HTTPS) */
  127. virtual BOOL IsSecure () = 0;
  128. /* 检查通信组件是否已启动 */
  129. virtual BOOL HasStarted () = 0;
  130. /* 查看通信组件当前状态 */
  131. virtual EnServiceState GetState () = 0;
  132. /* 获取连接数 */
  133. virtual DWORD GetConnectionCount () = 0;
  134. /* 获取所有连接的 CONNID */
  135. virtual BOOL GetAllConnectionIDs (CONNID pIDs[], DWORD& dwCount) = 0;
  136. /* 获取某个连接时长(毫秒) */
  137. virtual BOOL GetConnectPeriod (CONNID dwConnID, DWORD& dwPeriod) = 0;
  138. /* 获取某个连接静默时间(毫秒) */
  139. virtual BOOL GetSilencePeriod (CONNID dwConnID, DWORD& dwPeriod) = 0;
  140. /* 获取某个连接的本地地址信息 */
  141. virtual BOOL GetLocalAddress (CONNID dwConnID, TCHAR lpszAddress[], int& iAddressLen, USHORT& usPort) = 0;
  142. /* 获取某个连接的远程地址信息 */
  143. virtual BOOL GetRemoteAddress (CONNID dwConnID, TCHAR lpszAddress[], int& iAddressLen, USHORT& usPort) = 0;
  144. /* 获取最近一次失败操作的错误代码 */
  145. virtual EnSocketError GetLastError () = 0;
  146. /* 获取最近一次失败操作的错误描述 */
  147. virtual LPCTSTR GetLastErrorDesc () = 0;
  148. /* 获取连接中未发出数据的长度 */
  149. virtual BOOL GetPendingDataLength (CONNID dwConnID, int& iPending) = 0;
  150. /* 设置数据发送策略 */
  151. virtual void SetSendPolicy (EnSendPolicy enSendPolicy) = 0;
  152. /* 设置最大连接数(组件会根据设置值预分配内存,因此需要根据实际情况设置,不宜过大)*/
  153. virtual void SetMaxConnectionCount (DWORD dwMaxConnectionCount) = 0;
  154. /* 设置 Socket 缓存对象锁定时间(毫秒,在锁定期间该 Socket 缓存对象不能被获取使用) */
  155. virtual void SetFreeSocketObjLockTime (DWORD dwFreeSocketObjLockTime) = 0;
  156. /* 设置 Socket 缓存池大小(通常设置为平均并发连接数的 1/3 - 1/2) */
  157. virtual void SetFreeSocketObjPool (DWORD dwFreeSocketObjPool) = 0;
  158. /* 设置内存块缓存池大小(通常设置为 Socket 缓存池大小的 2 - 3 倍) */
  159. virtual void SetFreeBufferObjPool (DWORD dwFreeBufferObjPool) = 0;
  160. /* 设置 Socket 缓存池回收阀值(通常设置为 Socket 缓存池大小的 3 倍) */
  161. virtual void SetFreeSocketObjHold (DWORD dwFreeSocketObjHold) = 0;
  162. /* 设置内存块缓存池回收阀值(通常设置为内存块缓存池大小的 3 倍) */
  163. virtual void SetFreeBufferObjHold (DWORD dwFreeBufferObjHold) = 0;
  164. /* 设置工作线程数量(通常设置为 2 * CPU + 2) */
  165. virtual void SetWorkerThreadCount (DWORD dwWorkerThreadCount) = 0;
  166. /* 设置是否标记静默时间(设置为 TRUE 时 DisconnectSilenceConnections() 和 GetSilencePeriod() 才有效,默认:TRUE) */
  167. virtual void SetMarkSilence (BOOL bMarkSilence) = 0;
  168. /* 获取数据发送策略 */
  169. virtual EnSendPolicy GetSendPolicy () = 0;
  170. /* 获取最大连接数 */
  171. virtual DWORD GetMaxConnectionCount () = 0;
  172. /* 获取 Socket 缓存对象锁定时间 */
  173. virtual DWORD GetFreeSocketObjLockTime () = 0;
  174. /* 获取 Socket 缓存池大小 */
  175. virtual DWORD GetFreeSocketObjPool () = 0;
  176. /* 获取内存块缓存池大小 */
  177. virtual DWORD GetFreeBufferObjPool () = 0;
  178. /* 获取 Socket 缓存池回收阀值 */
  179. virtual DWORD GetFreeSocketObjHold () = 0;
  180. /* 获取内存块缓存池回收阀值 */
  181. virtual DWORD GetFreeBufferObjHold () = 0;
  182. /* 获取工作线程数量 */
  183. virtual DWORD GetWorkerThreadCount () = 0;
  184. /* 检测是否标记静默时间 */
  185. virtual BOOL IsMarkSilence () = 0;
  186. public:
  187. virtual ~IComplexSocket() {}
  188. };
  189. /************************************************************************
  190. 名称:通信服务端组件接口
  191. 描述:定义通信服务端组件的所有操作方法和属性访问方法
  192. ************************************************************************/
  193. class IServer : public IComplexSocket
  194. {
  195. public:
  196. /***********************************************************************/
  197. /***************************** 组件操作方法 *****************************/
  198. /*
  199. * 名称:启动通信组件
  200. * 描述:启动服务端通信组件,启动完成后可开始接收客户端连接并收发数据
  201. *
  202. * 参数: lpszBindAddress -- 监听地址
  203. * usPort -- 监听端口
  204. * 返回值: TRUE -- 成功
  205. * FALSE -- 失败,可通过 GetLastError() 获取错误代码
  206. */
  207. virtual BOOL Start (LPCTSTR lpszBindAddress, USHORT usPort) = 0;
  208. public:
  209. /***********************************************************************/
  210. /***************************** 属性访问方法 *****************************/
  211. /* 获取监听 Socket 的地址信息 */
  212. virtual BOOL GetListenAddress(TCHAR lpszAddress[], int& iAddressLen, USHORT& usPort) = 0;
  213. };
  214. /************************************************************************
  215. 名称:TCP 通信服务端组件接口
  216. 描述:定义 TCP 通信服务端组件的所有操作方法和属性访问方法
  217. ************************************************************************/
  218. class ITcpServer : public IServer
  219. {
  220. public:
  221. /***********************************************************************/
  222. /***************************** 组件操作方法 *****************************/
  223. /*
  224. * 名称:发送小文件
  225. * 描述:向指定连接发送 4096 KB 以下的小文件
  226. *
  227. * 参数: dwConnID -- 连接 ID
  228. * lpszFileName -- 文件路径
  229. * pHead -- 头部附加数据
  230. * pTail -- 尾部附加数据
  231. * 返回值: TRUE -- 成功
  232. * FALSE -- 失败,可通过 Windows API 函数 ::GetLastError() 获取 Windows 错误代码
  233. */
  234. virtual BOOL SendSmallFile(CONNID dwConnID, LPCTSTR lpszFileName, const LPWSABUF pHead = nullptr, const LPWSABUF pTail = nullptr) = 0;
  235. public:
  236. /***********************************************************************/
  237. /***************************** 属性访问方法 *****************************/
  238. /* 设置 Accept 预投递数量(根据负载调整设置,Accept 预投递数量越大则支持的并发连接请求越多) */
  239. virtual void SetAcceptSocketCount (DWORD dwAcceptSocketCount) = 0;
  240. /* 设置通信数据缓冲区大小(根据平均通信数据包大小调整设置,通常设置为 1024 的倍数) */
  241. virtual void SetSocketBufferSize (DWORD dwSocketBufferSize) = 0;
  242. /* 设置监听 Socket 的等候队列大小(根据并发连接数量调整设置) */
  243. virtual void SetSocketListenQueue (DWORD dwSocketListenQueue) = 0;
  244. /* 设置正常心跳包间隔(毫秒,0 则不发送心跳包,默认:30 * 1000) */
  245. virtual void SetKeepAliveTime (DWORD dwKeepAliveTime) = 0;
  246. /* 设置异常心跳包间隔(毫秒,0 不发送心跳包,,默认:10 * 1000,如果超过若干次 [默认:WinXP 5 次, Win7 10 次] 检测不到心跳确认包则认为已断线) */
  247. virtual void SetKeepAliveInterval (DWORD dwKeepAliveInterval) = 0;
  248. /* 获取 Accept 预投递数量 */
  249. virtual DWORD GetAcceptSocketCount () = 0;
  250. /* 获取通信数据缓冲区大小 */
  251. virtual DWORD GetSocketBufferSize () = 0;
  252. /* 获取监听 Socket 的等候队列大小 */
  253. virtual DWORD GetSocketListenQueue () = 0;
  254. /* 获取正常心跳包间隔 */
  255. virtual DWORD GetKeepAliveTime () = 0;
  256. /* 获取异常心跳包间隔 */
  257. virtual DWORD GetKeepAliveInterval () = 0;
  258. };
  259. /************************************************************************
  260. 名称:UDP 通信服务端组件接口
  261. 描述:定义 UDP 通信服务端组件的所有操作方法和属性访问方法
  262. ************************************************************************/
  263. class IUdpServer : public IServer
  264. {
  265. public:
  266. /***********************************************************************/
  267. /***************************** 组件操作方法 *****************************/
  268. public:
  269. /***********************************************************************/
  270. /***************************** 属性访问方法 *****************************/
  271. /* 设置数据报文最大长度(建议在局域网环境下不超过 1472 字节,在广域网环境下不超过 548 字节) */
  272. virtual void SetMaxDatagramSize (DWORD dwMaxDatagramSize) = 0;
  273. /* 获取数据报文最大长度 */
  274. virtual DWORD GetMaxDatagramSize () = 0;
  275. /* 设置 Receive 预投递数量(根据负载调整设置,Receive 预投递数量越大则丢包概率越小) */
  276. virtual void SetPostReceiveCount (DWORD dwPostReceiveCount) = 0;
  277. /* 获取 Receive 预投递数量 */
  278. virtual DWORD GetPostReceiveCount () = 0;
  279. /* 设置监测包尝试次数(0 则不发送监测跳包,如果超过最大尝试次数则认为已断线) */
  280. virtual void SetDetectAttempts (DWORD dwDetectAttempts) = 0;
  281. /* 设置监测包发送间隔(秒,0 不发送监测包) */
  282. virtual void SetDetectInterval (DWORD dwDetectInterval) = 0;
  283. /* 获取心跳检查次数 */
  284. virtual DWORD GetDetectAttempts () = 0;
  285. /* 获取心跳检查间隔 */
  286. virtual DWORD GetDetectInterval () = 0;
  287. };
  288. /************************************************************************
  289. 名称:通信代理组件接口
  290. 描述:定义通信代理组件的所有操作方法和属性访问方法,代理组件本质是一个同时连接多个服务器的客户端组件
  291. ************************************************************************/
  292. class IAgent : public IComplexSocket
  293. {
  294. public:
  295. /***********************************************************************/
  296. /***************************** 组件操作方法 *****************************/
  297. /*
  298. * 名称:启动通信组件
  299. * 描述:启动通信代理组件,启动完成后可开始连接远程服务器
  300. *
  301. * 参数: lpszBindAddress -- 绑定地址(默认:nullptr,绑定 0.0.0.0)
  302. * bAsyncConnect -- 是否采用异步 Connect
  303. * 返回值: TRUE -- 成功
  304. * FALSE -- 失败,可通过 GetLastError() 获取错误代码
  305. */
  306. virtual BOOL Start (LPCTSTR lpszBindAddress = nullptr, BOOL bAsyncConnect = TRUE) = 0;
  307. /*
  308. * 名称:连接服务器
  309. * 描述:连接服务器,连接成功后 IAgentListener 会接收到 OnConnect() / OnHandShake() 事件
  310. *
  311. * 参数: lpszRemoteAddress -- 服务端地址
  312. * usPort -- 服务端端口
  313. * pdwConnID -- 连接 ID(默认:nullptr,不获取连接 ID)
  314. * 返回值: TRUE -- 成功
  315. * FALSE -- 失败,可通过 Windows API 函数 ::GetLastError() 获取 Windows 错误代码
  316. */
  317. virtual BOOL Connect (LPCTSTR lpszRemoteAddress, USHORT usPort, CONNID* pdwConnID = nullptr) = 0;
  318. public:
  319. /***********************************************************************/
  320. /***************************** 属性访问方法 *****************************/
  321. /* 获取某个连接的远程主机信息 */
  322. virtual BOOL GetRemoteHost (CONNID dwConnID, TCHAR lpszHost[], int& iHostLen, USHORT& usPort) = 0;
  323. };
  324. /************************************************************************
  325. 名称:TCP 通信代理组件接口
  326. 描述:定义 TCP 通信代理组件的所有操作方法和属性访问方法
  327. ************************************************************************/
  328. class ITcpAgent : public IAgent
  329. {
  330. public:
  331. /***********************************************************************/
  332. /***************************** 组件操作方法 *****************************/
  333. /*
  334. * 名称:发送小文件
  335. * 描述:向指定连接发送 4096 KB 以下的小文件
  336. *
  337. * 参数: dwConnID -- 连接 ID
  338. * lpszFileName -- 文件路径
  339. * pHead -- 头部附加数据
  340. * pTail -- 尾部附加数据
  341. * 返回值: TRUE -- 成功
  342. * FALSE -- 失败,可通过 Windows API 函数 ::GetLastError() 获取 Windows 错误代码
  343. */
  344. virtual BOOL SendSmallFile(CONNID dwConnID, LPCTSTR lpszFileName, const LPWSABUF pHead = nullptr, const LPWSABUF pTail = nullptr) = 0;
  345. public:
  346. /***********************************************************************/
  347. /***************************** 属性访问方法 *****************************/
  348. /* 设置是否启用地址重用机制(默认:不启用) */
  349. virtual void SetReuseAddress (BOOL bReuseAddress) = 0;
  350. /* 检测是否启用地址重用机制 */
  351. virtual BOOL IsReuseAddress () = 0;
  352. /* 设置通信数据缓冲区大小(根据平均通信数据包大小调整设置,通常设置为 1024 的倍数) */
  353. virtual void SetSocketBufferSize (DWORD dwSocketBufferSize) = 0;
  354. /* 设置正常心跳包间隔(毫秒,0 则不发送心跳包,默认:30 * 1000) */
  355. virtual void SetKeepAliveTime (DWORD dwKeepAliveTime) = 0;
  356. /* 设置异常心跳包间隔(毫秒,0 不发送心跳包,,默认:10 * 1000,如果超过若干次 [默认:WinXP 5 次, Win7 10 次] 检测不到心跳确认包则认为已断线) */
  357. virtual void SetKeepAliveInterval (DWORD dwKeepAliveInterval) = 0;
  358. /* 获取通信数据缓冲区大小 */
  359. virtual DWORD GetSocketBufferSize () = 0;
  360. /* 获取正常心跳包间隔 */
  361. virtual DWORD GetKeepAliveTime () = 0;
  362. /* 获取异常心跳包间隔 */
  363. virtual DWORD GetKeepAliveInterval () = 0;
  364. };
  365. /************************************************************************
  366. 名称:通信客户端组件接口
  367. 描述:定义通信客户端组件的所有操作方法和属性访问方法
  368. ************************************************************************/
  369. class IClient
  370. {
  371. public:
  372. /***********************************************************************/
  373. /***************************** 组件操作方法 *****************************/
  374. /*
  375. * 名称:启动通信组件
  376. * 描述:启动客户端通信组件并连接服务端,启动完成后可开始收发数据
  377. *
  378. * 参数: lpszRemoteAddress -- 服务端地址
  379. * usPort -- 服务端端口
  380. * bAsyncConnect -- 是否采用异步 Connect
  381. * lpszBindAddress -- 绑定地址(默认:nullptr,TcpClient/UdpClient -> 不执行绑定操作,UdpCast 绑定 -> 0.0.0.0)
  382. * 返回值: TRUE -- 成功
  383. * FALSE -- 失败,可通过 GetLastError() 获取错误代码
  384. */
  385. virtual BOOL Start (LPCTSTR lpszRemoteAddress, USHORT usPort, BOOL bAsyncConnect = TRUE, LPCTSTR lpszBindAddress = nullptr) = 0;
  386. /*
  387. * 名称:关闭通信组件
  388. * 描述:关闭客户端通信组件,关闭完成后断开与服务端的连接并释放所有资源
  389. *
  390. * 参数:
  391. * 返回值: TRUE -- 成功
  392. * FALSE -- 失败,可通过 GetLastError() 获取错误代码
  393. */
  394. virtual BOOL Stop () = 0;
  395. /*
  396. * 名称:发送数据
  397. * 描述:向服务端发送数据
  398. *
  399. * 参数: pBuffer -- 发送缓冲区
  400. * iLength -- 发送缓冲区长度
  401. * iOffset -- 发送缓冲区指针偏移量
  402. * 返回值: TRUE -- 成功
  403. * FALSE -- 失败,可通过 Windows API 函数 ::GetLastError() 获取 Windows 错误代码
  404. */
  405. virtual BOOL Send (const BYTE* pBuffer, int iLength, int iOffset = 0) = 0;
  406. /*
  407. * 名称:发送多组数据
  408. * 描述:向服务端发送多组数据
  409. * TCP - 顺序发送所有数据包
  410. * UDP - 把所有数据包组合成一个数据包发送(数据包的总长度不能大于设置的 UDP 包最大长度)
  411. *
  412. * 参数: pBuffers -- 发送缓冲区数组
  413. * iCount -- 发送缓冲区数目
  414. * 返回值: TRUE -- 成功
  415. * FALSE -- 失败,可通过 Windows API 函数 ::GetLastError() 获取 Windows 错误代码
  416. */
  417. virtual BOOL SendPackets(const WSABUF pBuffers[], int iCount) = 0;
  418. public:
  419. /***********************************************************************/
  420. /***************************** 属性访问方法 *****************************/
  421. /* 设置连接的附加数据 */
  422. virtual void SetExtra (PVOID pExtra) = 0;
  423. /* 获取连接的附加数据 */
  424. virtual PVOID GetExtra () = 0;
  425. /* 检测是否为安全连接(SSL/HTTPS) */
  426. virtual BOOL IsSecure () = 0;
  427. /* 检查通信组件是否已启动 */
  428. virtual BOOL HasStarted () = 0;
  429. /* 查看通信组件当前状态 */
  430. virtual EnServiceState GetState () = 0;
  431. /* 获取最近一次失败操作的错误代码 */
  432. virtual EnSocketError GetLastError () = 0;
  433. /* 获取最近一次失败操作的错误描述 */
  434. virtual LPCTSTR GetLastErrorDesc() = 0;
  435. /* 获取该组件对象的连接 ID */
  436. virtual CONNID GetConnectionID () = 0;
  437. /* 获取 Client Socket 的地址信息 */
  438. virtual BOOL GetLocalAddress (TCHAR lpszAddress[], int& iAddressLen, USHORT& usPort) = 0;
  439. /* 获取连接的远程主机信息 */
  440. virtual BOOL GetRemoteHost (TCHAR lpszHost[], int& iHostLen, USHORT& usPort) = 0;
  441. /* 获取连接中未发出数据的长度 */
  442. virtual BOOL GetPendingDataLength (int& iPending) = 0;
  443. /* 设置内存块缓存池大小(通常设置为 -> PUSH 模型:5 - 10;PULL 模型:10 - 20 ) */
  444. virtual void SetFreeBufferPoolSize (DWORD dwFreeBufferPoolSize) = 0;
  445. /* 设置内存块缓存池回收阀值(通常设置为内存块缓存池大小的 3 倍) */
  446. virtual void SetFreeBufferPoolHold (DWORD dwFreeBufferPoolHold) = 0;
  447. /* 获取内存块缓存池大小 */
  448. virtual DWORD GetFreeBufferPoolSize () = 0;
  449. /* 获取内存块缓存池回收阀值 */
  450. virtual DWORD GetFreeBufferPoolHold () = 0;
  451. public:
  452. virtual ~IClient() {}
  453. };
  454. /************************************************************************
  455. 名称:TCP 通信客户端组件接口
  456. 描述:定义 TCP 通信客户端组件的所有操作方法和属性访问方法
  457. ************************************************************************/
  458. class ITcpClient : public IClient
  459. {
  460. public:
  461. /***********************************************************************/
  462. /***************************** 组件操作方法 *****************************/
  463. /*
  464. * 名称:发送小文件
  465. * 描述:向服务端发送 4096 KB 以下的小文件
  466. *
  467. * 参数: lpszFileName -- 文件路径
  468. * pHead -- 头部附加数据
  469. * pTail -- 尾部附加数据
  470. * 返回值: TRUE -- 成功
  471. * FALSE -- 失败,可通过 Windows API 函数 ::GetLastError() 获取 Windows 错误代码
  472. */
  473. virtual BOOL SendSmallFile(LPCTSTR lpszFileName, const LPWSABUF pHead = nullptr, const LPWSABUF pTail = nullptr) = 0;
  474. public:
  475. /***********************************************************************/
  476. /***************************** 属性访问方法 *****************************/
  477. /* 设置通信数据缓冲区大小(根据平均通信数据包大小调整设置,通常设置为:(N * 1024) - sizeof(TBufferObj)) */
  478. virtual void SetSocketBufferSize (DWORD dwSocketBufferSize) = 0;
  479. /* 设置正常心跳包间隔(毫秒,0 则不发送心跳包,默认:30 * 1000) */
  480. virtual void SetKeepAliveTime (DWORD dwKeepAliveTime) = 0;
  481. /* 设置异常心跳包间隔(毫秒,0 不发送心跳包,,默认:10 * 1000,如果超过若干次 [默认:WinXP 5 次, Win7 10 次] 检测不到心跳确认包则认为已断线) */
  482. virtual void SetKeepAliveInterval (DWORD dwKeepAliveInterval) = 0;
  483. /* 获取通信数据缓冲区大小 */
  484. virtual DWORD GetSocketBufferSize () = 0;
  485. /* 获取正常心跳包间隔 */
  486. virtual DWORD GetKeepAliveTime () = 0;
  487. /* 获取异常心跳包间隔 */
  488. virtual DWORD GetKeepAliveInterval () = 0;
  489. };
  490. /************************************************************************
  491. 名称:UDP 通信客户端组件接口
  492. 描述:定义 UDP 通信客户端组件的所有操作方法和属性访问方法
  493. ************************************************************************/
  494. class IUdpClient : public IClient
  495. {
  496. public:
  497. /***********************************************************************/
  498. /***************************** 组件操作方法 *****************************/
  499. public:
  500. /***********************************************************************/
  501. /***************************** 属性访问方法 *****************************/
  502. /* 设置数据报文最大长度(建议在局域网环境下不超过 1472 字节,在广域网环境下不超过 548 字节) */
  503. virtual void SetMaxDatagramSize (DWORD dwMaxDatagramSize) = 0;
  504. /* 获取数据报文最大长度 */
  505. virtual DWORD GetMaxDatagramSize() = 0;
  506. /* 设置监测包尝试次数(0 则不发送监测跳包,如果超过最大尝试次数则认为已断线) */
  507. virtual void SetDetectAttempts (DWORD dwDetectAttempts) = 0;
  508. /* 设置监测包发送间隔(秒,0 不发送监测包) */
  509. virtual void SetDetectInterval (DWORD dwDetectInterval) = 0;
  510. /* 获取心跳检查次数 */
  511. virtual DWORD GetDetectAttempts () = 0;
  512. /* 获取心跳检查间隔 */
  513. virtual DWORD GetDetectInterval () = 0;
  514. };
  515. /************************************************************************
  516. 名称:UDP 传播组件接口
  517. 描述:定义 UDP 传播(组播或广播)组件的所有操作方法和属性访问方法
  518. ************************************************************************/
  519. class IUdpCast : public IClient
  520. {
  521. public:
  522. /***********************************************************************/
  523. /***************************** 组件操作方法 *****************************/
  524. public:
  525. /***********************************************************************/
  526. /***************************** 属性访问方法 *****************************/
  527. /* 设置数据报文最大长度(建议在局域网环境下不超过 1472 字节,在广域网环境下不超过 548 字节) */
  528. virtual void SetMaxDatagramSize (DWORD dwMaxDatagramSize) = 0;
  529. /* 获取数据报文最大长度 */
  530. virtual DWORD GetMaxDatagramSize() = 0;
  531. /* 设置是否启用地址重用机制(默认:不启用) */
  532. virtual void SetReuseAddress (BOOL bReuseAddress) = 0;
  533. /* 检测是否启用地址重用机制 */
  534. virtual BOOL IsReuseAddress () = 0;
  535. /* 设置传播模式(组播或广播) */
  536. virtual void SetCastMode (EnCastMode enCastMode) = 0;
  537. /* 获取传播模式 */
  538. virtual EnCastMode GetCastMode () = 0;
  539. /* 设置组播报文的 TTL(0 - 255) */
  540. virtual void SetMultiCastTtl (int iMCTtl) = 0;
  541. /* 获取组播报文的 TTL */
  542. virtual int GetMultiCastTtl () = 0;
  543. /* 设置是否启用组播环路(TRUE or FALSE) */
  544. virtual void SetMultiCastLoop (BOOL bMCLoop) = 0;
  545. /* 检测是否启用组播环路 */
  546. virtual BOOL IsMultiCastLoop () = 0;
  547. /* 获取当前数据报的远程地址信息(通常在 OnReceive 事件中调用) */
  548. virtual BOOL GetRemoteAddress (TCHAR lpszAddress[], int& iAddressLen, USHORT& usPort) = 0;
  549. };
  550. /************************************************************************
  551. 名称:双接口模版类
  552. 描述:定义双接口转换方法
  553. ************************************************************************/
  554. template<class F, class S> class DualInterface : public F, public S
  555. {
  556. public:
  557. /* this 转换为 F* */
  558. inline static F* ToF(DualInterface* pThis)
  559. {
  560. return (F*)(pThis);
  561. }
  562. /* F* 转换为 this */
  563. inline static DualInterface* FromF(F* pF)
  564. {
  565. return (DualInterface*)(pF);
  566. }
  567. /* this 转换为 S* */
  568. inline static S* ToS(DualInterface* pThis)
  569. {
  570. return (S*)(F2S(ToF(pThis)));
  571. }
  572. /* S* 转换为 this */
  573. inline static DualInterface* FromS(S* pS)
  574. {
  575. return FromF(S2F(pS));
  576. }
  577. /* S* 转换为 F* */
  578. inline static F* S2F(S* pS)
  579. {
  580. return (F*)((char*)pS - sizeof(F));
  581. }
  582. /* F* 转换为 S* */
  583. inline static S* F2S(F* pF)
  584. {
  585. return (S*)((char*)pF + sizeof(F));
  586. }
  587. public:
  588. ~DualInterface() {}
  589. };
  590. /************************************************************************
  591. 名称:Server/Agent PULL 模型组件接口
  592. 描述:定义 Server/Agent 组件的 PULL 模型组件的所有操作方法
  593. ************************************************************************/
  594. class IPullSocket
  595. {
  596. public:
  597. /*
  598. * 名称:抓取数据
  599. * 描述:用户通过该方法从 Socket 组件中抓取数据
  600. *
  601. * 参数: dwConnID -- 连接 ID
  602. * pData -- 抓取缓冲区
  603. * iLength -- 抓取数据长度
  604. * 返回值: EnFetchResult
  605. */
  606. virtual EnFetchResult Fetch (CONNID dwConnID, BYTE* pData, int iLength) = 0;
  607. /*
  608. * 名称:窥探数据(不会移除缓冲区数据)
  609. * 描述:用户通过该方法从 Socket 组件中窥探数据
  610. *
  611. * 参数: dwConnID -- 连接 ID
  612. * pData -- 窥探缓冲区
  613. * iLength -- 窥探数据长度
  614. * 返回值: EnFetchResult
  615. */
  616. virtual EnFetchResult Peek (CONNID dwConnID, BYTE* pData, int iLength) = 0;
  617. public:
  618. virtual ~IPullSocket() {}
  619. };
  620. /************************************************************************
  621. 名称:Client PULL 模型组件接口
  622. 描述:定义 Client 组件的 PULL 模型组件的所有操作方法
  623. ************************************************************************/
  624. class IPullClient
  625. {
  626. public:
  627. /*
  628. * 名称:抓取数据
  629. * 描述:用户通过该方法从 Socket 组件中抓取数据
  630. *
  631. * 参数: pData -- 抓取缓冲区
  632. * iLength -- 抓取数据长度
  633. * 返回值: EnFetchResult
  634. */
  635. virtual EnFetchResult Fetch (BYTE* pData, int iLength) = 0;
  636. /*
  637. * 名称:窥探数据(不会移除缓冲区数据)
  638. * 描述:用户通过该方法从 Socket 组件中窥探数据
  639. *
  640. * 参数: pData -- 窥探缓冲区
  641. * iLength -- 窥探数据长度
  642. * 返回值: EnFetchResult
  643. */
  644. virtual EnFetchResult Peek (BYTE* pData, int iLength) = 0;
  645. public:
  646. virtual ~IPullClient() {}
  647. };
  648. /************************************************************************
  649. 名称:TCP PULL 模型组件接口
  650. 描述:继承了 PULL 和 Socket 接口
  651. ************************************************************************/
  652. typedef DualInterface<IPullSocket, ITcpServer> ITcpPullServer;
  653. typedef DualInterface<IPullSocket, ITcpAgent> ITcpPullAgent;
  654. typedef DualInterface<IPullClient, ITcpClient> ITcpPullClient;
  655. /************************************************************************
  656. 名称:Server/Agent PACK 模型组件接口
  657. 描述:定义 Server/Agent 组件的 PACK 模型组件的所有操作方法
  658. ************************************************************************/
  659. class IPackSocket
  660. {
  661. public:
  662. /***********************************************************************/
  663. /***************************** 属性访问方法 *****************************/
  664. /* 设置数据包最大长度(有效数据包最大长度不能超过 4194303/0x3FFFFF 字节,默认:262144/0x40000) */
  665. virtual void SetMaxPackSize (DWORD dwMaxPackSize) = 0;
  666. /* 设置包头标识(有效包头标识取值范围 0 ~ 1023/0x3FF,当包头标识为 0 时不校验包头,默认:0) */
  667. virtual void SetPackHeaderFlag (USHORT usPackHeaderFlag) = 0;
  668. /* 获取数据包最大长度 */
  669. virtual DWORD GetMaxPackSize () = 0;
  670. /* 获取包头标识 */
  671. virtual USHORT GetPackHeaderFlag() = 0;
  672. public:
  673. virtual ~IPackSocket() {}
  674. };
  675. /************************************************************************
  676. 名称:Client PACK 模型组件接口
  677. 描述:定义 Client 组件的 PACK 模型组件的所有操作方法
  678. ************************************************************************/
  679. class IPackClient
  680. {
  681. public:
  682. /***********************************************************************/
  683. /***************************** 属性访问方法 *****************************/
  684. /* 设置数据包最大长度(有效数据包最大长度不能超过 4194303/0x3FFFFF 字节,默认:262144/0x40000) */
  685. virtual void SetMaxPackSize (DWORD dwMaxPackSize) = 0;
  686. /* 设置包头标识(有效包头标识取值范围 0 ~ 1023/0x3FF,当包头标识为 0 时不校验包头,默认:0) */
  687. virtual void SetPackHeaderFlag (USHORT usPackHeaderFlag) = 0;
  688. /* 获取数据包最大长度 */
  689. virtual DWORD GetMaxPackSize () = 0;
  690. /* 获取包头标识 */
  691. virtual USHORT GetPackHeaderFlag() = 0;
  692. public:
  693. virtual ~IPackClient() {}
  694. };
  695. /************************************************************************
  696. 名称:TCP PACK 模型组件接口
  697. 描述:继承了 PACK 和 Socket 接口
  698. ************************************************************************/
  699. typedef DualInterface<IPackSocket, ITcpServer> ITcpPackServer;
  700. typedef DualInterface<IPackSocket, ITcpAgent> ITcpPackAgent;
  701. typedef DualInterface<IPackClient, ITcpClient> ITcpPackClient;
  702. /************************************************************************
  703. 名称:Socket 监听器基接口
  704. 描述:定义组件监听器的公共方法
  705. ************************************************************************/
  706. template<class T> class ISocketListenerT
  707. {
  708. public:
  709. /*
  710. * 名称:握手完成通知
  711. * 描述:连接完成握手时,Socket 监听器将收到该通知,监听器接收到该通知后才能开始
  712. * 数据收发操作
  713. *
  714. * 参数: pSender -- 事件源对象
  715. * dwConnID -- 连接 ID
  716. * 返回值: HR_OK / HR_IGNORE -- 继续执行
  717. * HR_ERROR -- 引发 OnClose() 事件并关闭连接
  718. */
  719. virtual EnHandleResult OnHandShake(T* pSender, CONNID dwConnID) = 0;
  720. /*
  721. * 名称:已发送数据通知
  722. * 描述:成功发送数据后,Socket 监听器将收到该通知
  723. *
  724. * 参数: pSender -- 事件源对象
  725. * dwConnID -- 连接 ID
  726. * pData -- 已发送数据缓冲区
  727. * iLength -- 已发送数据长度
  728. * 返回值: HR_OK / HR_IGNORE -- 继续执行
  729. * HR_ERROR -- 该通知不允许返回 HR_ERROR(调试模式下引发断言错误)
  730. */
  731. virtual EnHandleResult OnSend(T* pSender, CONNID dwConnID, const BYTE* pData, int iLength) = 0;
  732. /*
  733. * 名称:数据到达通知(PUSH 模型)
  734. * 描述:对于 PUSH 模型的 Socket 通信组件,成功接收数据后将向 Socket 监听器发送该通知
  735. *
  736. * 参数: pSender -- 事件源对象
  737. * dwConnID -- 连接 ID
  738. * pData -- 已接收数据缓冲区
  739. * iLength -- 已接收数据长度
  740. * 返回值: HR_OK / HR_IGNORE -- 继续执行
  741. * HR_ERROR -- 引发 OnClose() 事件并关闭连接
  742. */
  743. virtual EnHandleResult OnReceive(T* pSender, CONNID dwConnID, const BYTE* pData, int iLength) = 0;
  744. /*
  745. * 名称:数据到达通知(PULL 模型)
  746. * 描述:对于 PULL 模型的 Socket 通信组件,成功接收数据后将向 Socket 监听器发送该通知
  747. *
  748. * 参数: pSender -- 事件源对象
  749. * dwConnID -- 连接 ID
  750. * iLength -- 已接收数据长度
  751. * 返回值: HR_OK / HR_IGNORE -- 继续执行
  752. * HR_ERROR -- 引发 OnClose() 事件并关闭连接
  753. */
  754. virtual EnHandleResult OnReceive(T* pSender, CONNID dwConnID, int iLength) = 0;
  755. /*
  756. * 名称:通信错误通知
  757. * 描述:通信发生错误后,Socket 监听器将收到该通知,并关闭连接
  758. *
  759. * 参数: pSender -- 事件源对象
  760. * dwConnID -- 连接 ID
  761. * enOperation -- Socket 操作类型
  762. * iErrorCode -- 错误代码
  763. * 返回值: 忽略返回值
  764. */
  765. virtual EnHandleResult OnClose(T* pSender, CONNID dwConnID, EnSocketOperation enOperation, int iErrorCode) = 0;
  766. public:
  767. virtual ~ISocketListenerT() {}
  768. };
  769. template<class T> class IComplexSocketListenerT : public ISocketListenerT<T>
  770. {
  771. public:
  772. /*
  773. * 名称:关闭通信组件通知
  774. * 描述:通信组件关闭时,Socket 监听器将收到该通知
  775. *
  776. * 参数: pSender -- 事件源对象
  777. * 返回值:忽略返回值
  778. */
  779. virtual EnHandleResult OnShutdown(T* pSender) = 0;
  780. };
  781. /************************************************************************
  782. 名称:服务端 Socket 监听器接口
  783. 描述:定义服务端 Socket 监听器的所有事件
  784. ************************************************************************/
  785. template<class T> class IServerListenerT : public IComplexSocketListenerT<T>
  786. {
  787. public:
  788. /*
  789. * 名称:准备监听通知
  790. * 描述:通信服务端组件启动时,在监听 Socket 创建完成并开始执行监听前,Socket 监听
  791. * 器将收到该通知,监听器可以在通知处理方法中执行 Socket 选项设置等额外工作
  792. *
  793. * 参数: pSender -- 事件源对象
  794. * soListen -- 监听 Socket
  795. * 返回值: HR_OK / HR_IGNORE -- 继续执行
  796. * HR_ERROR -- 终止启动通信服务组件
  797. */
  798. virtual EnHandleResult OnPrepareListen(T* pSender, SOCKET soListen) = 0;
  799. /*
  800. * 名称:接收连接通知
  801. * 描述:接收到客户端连接请求时,Socket 监听器将收到该通知,监听器可以在通知处理方
  802. * 法中执行 Socket 选项设置或拒绝客户端连接等额外工作
  803. *
  804. * 参数: pSender -- 事件源对象
  805. * dwConnID -- 连接 ID
  806. * soClient -- TCP: 客户端 Socket 句柄,UDP: 客户端 Socket SOCKADDR_IN 指针
  807. * 返回值: HR_OK / HR_IGNORE -- 接受连接
  808. * HR_ERROR -- 拒绝连接
  809. */
  810. virtual EnHandleResult OnAccept(T* pSender, CONNID dwConnID, UINT_PTR soClient) = 0;
  811. };
  812. /************************************************************************
  813. 名称:TCP 服务端 Socket 监听器接口
  814. 描述:定义 TCP 服务端 Socket 监听器的所有事件
  815. ************************************************************************/
  816. class ITcpServerListener : public IServerListenerT<ITcpServer>
  817. {
  818. public:
  819. };
  820. /************************************************************************
  821. 名称:PUSH 模型服务端 Socket 监听器抽象基类
  822. 描述:定义某些事件的默认处理方法(忽略事件)
  823. ************************************************************************/
  824. class CTcpServerListener : public ITcpServerListener
  825. {
  826. public:
  827. virtual EnHandleResult OnPrepareListen(ITcpServer* pSender, SOCKET soListen) {return HR_IGNORE;}
  828. virtual EnHandleResult OnAccept(ITcpServer* pSender, CONNID dwConnID, UINT_PTR soClient) {return HR_IGNORE;}
  829. virtual EnHandleResult OnHandShake(ITcpServer* pSender, CONNID dwConnID) {return HR_IGNORE;}
  830. virtual EnHandleResult OnReceive(ITcpServer* pSender, CONNID dwConnID, int iLength) {return HR_IGNORE;}
  831. virtual EnHandleResult OnSend(ITcpServer* pSender, CONNID dwConnID, const BYTE* pData, int iLength) {return HR_IGNORE;}
  832. virtual EnHandleResult OnShutdown(ITcpServer* pSender) {return HR_IGNORE;}
  833. };
  834. /************************************************************************
  835. 名称:PULL 模型服务端 Socket 监听器抽象基类
  836. 描述:定义某些事件的默认处理方法(忽略事件)
  837. ************************************************************************/
  838. class CTcpPullServerListener : public CTcpServerListener
  839. {
  840. public:
  841. virtual EnHandleResult OnReceive(ITcpServer* pSender, CONNID dwConnID, int iLength) = 0;
  842. virtual EnHandleResult OnReceive(ITcpServer* pSender, CONNID dwConnID, const BYTE* pData, int iLength) {return HR_IGNORE;}
  843. };
  844. /************************************************************************
  845. 名称:UDP 服务端 Socket 监听器接口
  846. 描述:定义 UDP 服务端 Socket 监听器的所有事件
  847. ************************************************************************/
  848. class IUdpServerListener : public IServerListenerT<IUdpServer>
  849. {
  850. public:
  851. };
  852. /************************************************************************
  853. 名称:UDP 服务端 Socket 监听器抽象基类
  854. 描述:定义某些事件的默认处理方法(忽略事件)
  855. ************************************************************************/
  856. class CUdpServerListener : public IUdpServerListener
  857. {
  858. public:
  859. virtual EnHandleResult OnPrepareListen(IUdpServer* pSender, SOCKET soListen) {return HR_IGNORE;}
  860. virtual EnHandleResult OnAccept(IUdpServer* pSender, CONNID dwConnID, UINT_PTR pSockAddr) {return HR_IGNORE;}
  861. virtual EnHandleResult OnHandShake(IUdpServer* pSender, CONNID dwConnID) {return HR_IGNORE;}
  862. virtual EnHandleResult OnReceive(IUdpServer* pSender, CONNID dwConnID, int iLength) {return HR_IGNORE;}
  863. virtual EnHandleResult OnSend(IUdpServer* pSender, CONNID dwConnID, const BYTE* pData, int iLength) {return HR_IGNORE;}
  864. virtual EnHandleResult OnShutdown(IUdpServer* pSender) {return HR_IGNORE;}
  865. };
  866. /************************************************************************
  867. 名称:通信代理 Socket 监听器接口
  868. 描述:定义 通信代理 Socket 监听器的所有事件
  869. ************************************************************************/
  870. template<class T> class IAgentListenerT : public IComplexSocketListenerT<T>
  871. {
  872. public:
  873. /*
  874. * 名称:准备连接通知
  875. * 描述:通信客户端组件启动时,在客户端 Socket 创建完成并开始执行连接前,Socket 监听
  876. * 器将收到该通知,监听器可以在通知处理方法中执行 Socket 选项设置等额外工作
  877. *
  878. * 参数: pSender -- 事件源对象
  879. * dwConnID -- 连接 ID
  880. * socket -- 客户端 Socket
  881. * 返回值: HR_OK / HR_IGNORE -- 继续执行
  882. * HR_ERROR -- 终止启动通信客户端组件
  883. */
  884. virtual EnHandleResult OnPrepareConnect(T* pSender, CONNID dwConnID, SOCKET socket) = 0;
  885. /*
  886. * 名称:连接完成通知
  887. * 描述:与服务端成功建立连接时,Socket 监听器将收到该通知
  888. *
  889. * 参数: pSender -- 事件源对象
  890. * dwConnID -- 连接 ID
  891. * 返回值: HR_OK / HR_IGNORE -- 继续执行
  892. * HR_ERROR -- 同步连接:终止启动通信客户端组件
  893. * 异步连接:关闭连接
  894. */
  895. virtual EnHandleResult OnConnect(T* pSender, CONNID dwConnID) = 0;
  896. };
  897. /************************************************************************
  898. 名称:TCP 通信代理 Socket 监听器接口
  899. 描述:定义 TCP 通信代理 Socket 监听器的所有事件
  900. ************************************************************************/
  901. class ITcpAgentListener : public IAgentListenerT<ITcpAgent>
  902. {
  903. public:
  904. };
  905. /************************************************************************
  906. 名称:PUSH 模型通信代理 Socket 监听器抽象基类
  907. 描述:定义某些事件的默认处理方法(忽略事件)
  908. ************************************************************************/
  909. class CTcpAgentListener : public ITcpAgentListener
  910. {
  911. public:
  912. virtual EnHandleResult OnPrepareConnect(ITcpAgent* pSender, CONNID dwConnID, SOCKET socket) {return HR_IGNORE;}
  913. virtual EnHandleResult OnConnect(ITcpAgent* pSender, CONNID dwConnID) {return HR_IGNORE;}
  914. virtual EnHandleResult OnHandShake(ITcpAgent* pSender, CONNID dwConnID) {return HR_IGNORE;}
  915. virtual EnHandleResult OnReceive(ITcpAgent* pSender, CONNID dwConnID, int iLength) {return HR_IGNORE;}
  916. virtual EnHandleResult OnSend(ITcpAgent* pSender, CONNID dwConnID, const BYTE* pData, int iLength) {return HR_IGNORE;}
  917. virtual EnHandleResult OnShutdown(ITcpAgent* pSender) {return HR_IGNORE;}
  918. };
  919. /************************************************************************
  920. 名称:PULL 通信代理 Socket 监听器抽象基类
  921. 描述:定义某些事件的默认处理方法(忽略事件)
  922. ************************************************************************/
  923. class CTcpPullAgentListener : public CTcpAgentListener
  924. {
  925. public:
  926. virtual EnHandleResult OnReceive(ITcpAgent* pSender, CONNID dwConnID, int iLength) = 0;
  927. virtual EnHandleResult OnReceive(ITcpAgent* pSender, CONNID dwConnID, const BYTE* pData, int iLength) {return HR_IGNORE;}
  928. };
  929. /************************************************************************
  930. 名称:客户端 Socket 监听器接口
  931. 描述:定义客户端 Socket 监听器的所有事件
  932. ************************************************************************/
  933. template<class T> class IClientListenerT : public ISocketListenerT<T>
  934. {
  935. public:
  936. /*
  937. * 名称:准备连接通知
  938. * 描述:通信客户端组件启动时,在客户端 Socket 创建完成并开始执行连接前,Socket 监听
  939. * 器将收到该通知,监听器可以在通知处理方法中执行 Socket 选项设置等额外工作
  940. *
  941. * 参数: pSender -- 事件源对象
  942. * dwConnID -- 连接 ID
  943. * socket -- 客户端 Socket
  944. * 返回值: HR_OK / HR_IGNORE -- 继续执行
  945. * HR_ERROR -- 终止启动通信客户端组件
  946. */
  947. virtual EnHandleResult OnPrepareConnect(T* pSender, CONNID dwConnID, SOCKET socket) = 0;
  948. /*
  949. * 名称:连接完成通知
  950. * 描述:与服务端成功建立连接时,Socket 监听器将收到该通知
  951. *
  952. * 参数: pSender -- 事件源对象
  953. * dwConnID -- 连接 ID
  954. * 返回值: HR_OK / HR_IGNORE -- 继续执行
  955. * HR_ERROR -- 同步连接:终止启动通信客户端组件
  956. * 异步连接:关闭连接
  957. */
  958. virtual EnHandleResult OnConnect(T* pSender, CONNID dwConnID) = 0;
  959. };
  960. /************************************************************************
  961. 名称:TCP 客户端 Socket 监听器接口
  962. 描述:定义 TCP 客户端 Socket 监听器的所有事件
  963. ************************************************************************/
  964. class ITcpClientListener : public IClientListenerT<ITcpClient>
  965. {
  966. public:
  967. };
  968. /************************************************************************
  969. 名称:PUSH 模型客户端 Socket 监听器抽象基类
  970. 描述:定义某些事件的默认处理方法(忽略事件)
  971. ************************************************************************/
  972. class CTcpClientListener : public ITcpClientListener
  973. {
  974. public:
  975. virtual EnHandleResult OnPrepareConnect(ITcpClient* pSender, CONNID dwConnID, SOCKET socket) {return HR_IGNORE;}
  976. virtual EnHandleResult OnConnect(ITcpClient* pSender, CONNID dwConnID) {return HR_IGNORE;}
  977. virtual EnHandleResult OnHandShake(ITcpClient* pSender, CONNID dwConnID) {return HR_IGNORE;}
  978. virtual EnHandleResult OnReceive(ITcpClient* pSender, CONNID dwConnID, int iLength) {return HR_IGNORE;}
  979. virtual EnHandleResult OnSend(ITcpClient* pSender, CONNID dwConnID, const BYTE* pData, int iLength) {return HR_IGNORE;}
  980. };
  981. /************************************************************************
  982. 名称:PULL 客户端 Socket 监听器抽象基类
  983. 描述:定义某些事件的默认处理方法(忽略事件)
  984. ************************************************************************/
  985. class CTcpPullClientListener : public CTcpClientListener
  986. {
  987. public:
  988. virtual EnHandleResult OnReceive(ITcpClient* pSender, CONNID dwConnID, int iLength) = 0;
  989. virtual EnHandleResult OnReceive(ITcpClient* pSender, CONNID dwConnID, const BYTE* pData, int iLength) {return HR_IGNORE;}
  990. };
  991. /************************************************************************
  992. 名称:UDP 客户端 Socket 监听器接口
  993. 描述:定义 UDP 客户端 Socket 监听器的所有事件
  994. ************************************************************************/
  995. class IUdpClientListener : public IClientListenerT<IUdpClient>
  996. {
  997. public:
  998. };
  999. /************************************************************************
  1000. 名称:UDP 户端 Socket 监听器抽象基类
  1001. 描述:定义某些事件的默认处理方法(忽略事件)
  1002. ************************************************************************/
  1003. class CUdpClientListener : public IUdpClientListener
  1004. {
  1005. public:
  1006. virtual EnHandleResult OnPrepareConnect(IUdpClient* pSender, CONNID dwConnID, SOCKET socket) {return HR_IGNORE;}
  1007. virtual EnHandleResult OnConnect(IUdpClient* pSender, CONNID dwConnID) {return HR_IGNORE;}
  1008. virtual EnHandleResult OnHandShake(IUdpClient* pSender, CONNID dwConnID) {return HR_IGNORE;}
  1009. virtual EnHandleResult OnReceive(IUdpClient* pSender, CONNID dwConnID, int iLength) {return HR_IGNORE;}
  1010. virtual EnHandleResult OnSend(IUdpClient* pSender, CONNID dwConnID, const BYTE* pData, int iLength) {return HR_IGNORE;}
  1011. };
  1012. /************************************************************************
  1013. 名称:UDP 传播 Socket 监听器接口
  1014. 描述:定义 UDP 传播 Socket 监听器的所有事件
  1015. ************************************************************************/
  1016. class IUdpCastListener : public IClientListenerT<IUdpCast>
  1017. {
  1018. public:
  1019. };
  1020. /************************************************************************
  1021. 名称:UDP 传播 Socket 监听器抽象基类
  1022. 描述:定义某些事件的默认处理方法(忽略事件)
  1023. ************************************************************************/
  1024. class CUdpCastListener : public IUdpCastListener
  1025. {
  1026. public:
  1027. virtual EnHandleResult OnPrepareConnect(IUdpCast* pSender, CONNID dwConnID, SOCKET socket) {return HR_IGNORE;}
  1028. virtual EnHandleResult OnConnect(IUdpCast* pSender, CONNID dwConnID) {return HR_IGNORE;}
  1029. virtual EnHandleResult OnHandShake(IUdpCast* pSender, CONNID dwConnID) {return HR_IGNORE;}
  1030. virtual EnHandleResult OnReceive(IUdpCast* pSender, CONNID dwConnID, int iLength) {return HR_IGNORE;}
  1031. virtual EnHandleResult OnSend(IUdpCast* pSender, CONNID dwConnID, const BYTE* pData, int iLength) {return HR_IGNORE;}
  1032. };
  1033. /*****************************************************************************************************************************************************/
  1034. /****************************************************************** HTTP Interfaces ******************************************************************/
  1035. /*****************************************************************************************************************************************************/
  1036. /************************************************************************
  1037. 名称:复合 Http 组件接口
  1038. 描述:定义复合 Http 组件的所有操作方法和属性访问方法,复合 Http 组件同时管理多个 Http 连接
  1039. ************************************************************************/
  1040. class IComplexHttp
  1041. {
  1042. public:
  1043. /***********************************************************************/
  1044. /***************************** 组件操作方法 *****************************/
  1045. /*
  1046. * 名称:发送 WebSocket 消息
  1047. * 描述:向对端端发送 WebSocket 消息
  1048. *
  1049. * 参数: dwConnID -- 连接 ID
  1050. * bFinal -- 是否结束帧
  1051. * iReserved -- RSV1/RSV2/RSV3 各 1 位
  1052. * iOperationCode -- 操作码:0x0 - 0xF
  1053. * lpszMask -- 掩码(nullptr 或 4 字节掩码,如果为 nullptr 则没有掩码)
  1054. * pData -- 消息体数据缓冲区
  1055. * iLength -- 消息体数据长度
  1056. * ullBodyLen -- 消息总长度
  1057. * ullBodyLen = 0 -> 消息总长度为 iLength
  1058. * ullBodyLen = iLength -> 消息总长度为 ullBodyLen
  1059. * ullBodyLen > iLength -> 消息总长度为 ullBodyLen,后续消息体长度为 ullBOdyLen - iLength,后续消息体通过底层方法 Send() / SendPackets() 发送
  1060. * ullBodyLen < iLength -> 错误参数,发送失败
  1061. * 返回值: TRUE -- 成功
  1062. * FALSE -- 失败
  1063. */
  1064. 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;
  1065. public:
  1066. /***********************************************************************/
  1067. /***************************** 属性访问方法 *****************************/
  1068. /* 设置本地协议版本 */
  1069. virtual void SetLocalVersion(EnHttpVersion usVersion) = 0;
  1070. /* 获取本地协议版本 */
  1071. virtual EnHttpVersion GetLocalVersion() = 0;
  1072. /* 检查是否升级协议 */
  1073. virtual BOOL IsUpgrade(CONNID dwConnID) = 0;
  1074. /* 检查是否有 Keep-Alive 标识 */
  1075. virtual BOOL IsKeepAlive(CONNID dwConnID) = 0;
  1076. /* 获取协议版本 */
  1077. virtual USHORT GetVersion(CONNID dwConnID) = 0;
  1078. /* 获取内容长度 */
  1079. virtual ULONGLONG GetContentLength(CONNID dwConnID) = 0;
  1080. /* 获取内容类型 */
  1081. virtual LPCSTR GetContentType(CONNID dwConnID) = 0;
  1082. /* 获取内容编码 */
  1083. virtual LPCSTR GetContentEncoding(CONNID dwConnID) = 0;
  1084. /* 获取传输编码 */
  1085. virtual LPCSTR GetTransferEncoding(CONNID dwConnID) = 0;
  1086. /* 获取协议升级类型 */
  1087. virtual EnHttpUpgradeType GetUpgradeType(CONNID dwConnID) = 0;
  1088. /* 获取解析错误代码 */
  1089. virtual USHORT GetParseErrorCode(CONNID dwConnID, LPCSTR* lpszErrorDesc = nullptr) = 0;
  1090. /* 获取某个请求头(单值) */
  1091. virtual BOOL GetHeader(CONNID dwConnID, LPCSTR lpszName, LPCSTR* lpszValue) = 0;
  1092. /* 获取某个请求头(多值) */
  1093. virtual BOOL GetHeaders(CONNID dwConnID, LPCSTR lpszName, LPCSTR lpszValue[], DWORD& dwCount) = 0;
  1094. /* 获取所有请求头 */
  1095. virtual BOOL GetAllHeaders(CONNID dwConnID, THeader lpHeaders[], DWORD& dwCount) = 0;
  1096. /* 获取所有请求头名称 */
  1097. virtual BOOL GetAllHeaderNames(CONNID dwConnID, LPCSTR lpszName[], DWORD& dwCount) = 0;
  1098. /* 获取 Cookie */
  1099. virtual BOOL GetCookie(CONNID dwConnID, LPCSTR lpszName, LPCSTR* lpszValue) = 0;
  1100. /* 获取所有 Cookie */
  1101. virtual BOOL GetAllCookies(CONNID dwConnID, TCookie lpCookies[], DWORD& dwCount) = 0;
  1102. /*
  1103. // !! maybe implemented in future !! //
  1104. virtual BOOL GetParam(CONNID dwConnID, LPCSTR lpszName, LPCSTR* lpszValue) = 0;
  1105. virtual BOOL GetParams(CONNID dwConnID, LPCSTR lpszName, LPCSTR lpszValue[], DWORD& dwCount) = 0;
  1106. virtual BOOL GetAllParams(CONNID dwConnID, LPPARAM lpszParam[], DWORD& dwCount) = 0;
  1107. virtual BOOL GetAllParamNames(CONNID dwConnID, LPCSTR lpszName[], DWORD& dwCount) = 0;
  1108. */
  1109. /* 获取当前 WebSocket 消息状态,传入 nullptr 则不获取相应字段 */
  1110. virtual BOOL GetWSMessageState(CONNID dwConnID, BOOL* lpbFinal, BYTE* lpiReserved, BYTE* lpiOperationCode, LPCBYTE* lpszMask, ULONGLONG* lpullBodyLen, ULONGLONG* lpullBodyRemain) = 0;
  1111. public:
  1112. virtual ~IComplexHttp() {}
  1113. };
  1114. /************************************************************************
  1115. 名称:复合 Http 请求者组件接口
  1116. 描述:定义复合 Http 请求者组件的所有操作方法和属性访问方法
  1117. ************************************************************************/
  1118. class IComplexHttpRequester : public IComplexHttp
  1119. {
  1120. public:
  1121. /***********************************************************************/
  1122. /***************************** 组件操作方法 *****************************/
  1123. /*
  1124. * 名称:发送请求
  1125. * 描述:向服务端发送 HTTP 请求
  1126. *
  1127. * 参数: dwConnID -- 连接 ID
  1128. * lpszMethod -- 请求方法
  1129. * lpszPath -- 请求路径
  1130. * lpHeaders -- 请求头
  1131. * iHeaderCount -- 请求头数量
  1132. * pBody -- 请求体
  1133. * iLength -- 请求体长度
  1134. * 返回值: TRUE -- 成功
  1135. * FALSE -- 失败
  1136. */
  1137. virtual BOOL SendRequest(CONNID dwConnID, LPCSTR lpszMethod, LPCSTR lpszPath, const THeader lpHeaders[] = nullptr, int iHeaderCount = 0, const BYTE* pBody = nullptr, int iLength = 0) = 0;
  1138. /*
  1139. * 名称:发送本地文件
  1140. * 描述:向指定连接发送 4096 KB 以下的小文件
  1141. *
  1142. * 参数: dwConnID -- 连接 ID
  1143. * lpszFileName -- 文件路径
  1144. * lpszMethod -- 请求方法
  1145. * lpszPath -- 请求路径
  1146. * lpHeaders -- 请求头
  1147. * iHeaderCount -- 请求头数量
  1148. * 返回值: TRUE -- 成功
  1149. * FALSE -- 失败
  1150. */
  1151. virtual BOOL SendLocalFile(CONNID dwConnID, LPCSTR lpszFileName, LPCSTR lpszMethod, LPCSTR lpszPath, const THeader lpHeaders[] = nullptr, int iHeaderCount = 0) = 0;
  1152. /* 发送 POST 请求 */
  1153. virtual BOOL SendPost(CONNID dwConnID, LPCSTR lpszPath, const THeader lpHeaders[], int iHeaderCount, const BYTE* pBody, int iLength) = 0;
  1154. /* 发送 PUT 请求 */
  1155. virtual BOOL SendPut(CONNID dwConnID, LPCSTR lpszPath, const THeader lpHeaders[], int iHeaderCount, const BYTE* pBody, int iLength) = 0;
  1156. /* 发送 PATCH 请求 */
  1157. virtual BOOL SendPatch(CONNID dwConnID, LPCSTR lpszPath, const THeader lpHeaders[], int iHeaderCount, const BYTE* pBody, int iLength) = 0;
  1158. /* 发送 GET 请求 */
  1159. virtual BOOL SendGet(CONNID dwConnID, LPCSTR lpszPath, const THeader lpHeaders[] = nullptr, int iHeaderCount = 0) = 0;
  1160. /* 发送 DELETE 请求 */
  1161. virtual BOOL SendDelete(CONNID dwConnID, LPCSTR lpszPath, const THeader lpHeaders[] = nullptr, int iHeaderCount = 0) = 0;
  1162. /* 发送 HEAD 请求 */
  1163. virtual BOOL SendHead(CONNID dwConnID, LPCSTR lpszPath, const THeader lpHeaders[] = nullptr, int iHeaderCount = 0) = 0;
  1164. /* 发送 TRACE 请求 */
  1165. virtual BOOL SendTrace(CONNID dwConnID, LPCSTR lpszPath, const THeader lpHeaders[] = nullptr, int iHeaderCount = 0) = 0;
  1166. /* 发送 OPTIONS 请求 */
  1167. virtual BOOL SendOptions(CONNID dwConnID, LPCSTR lpszPath, const THeader lpHeaders[] = nullptr, int iHeaderCount = 0) = 0;
  1168. /* 发送 CONNECT 请求 */
  1169. virtual BOOL SendConnect(CONNID dwConnID, LPCSTR lpszHost, const THeader lpHeaders[] = nullptr, int iHeaderCount = 0) = 0;
  1170. public:
  1171. /***********************************************************************/
  1172. /***************************** 属性访问方法 *****************************/
  1173. /* 获取 HTTP 状态码 */
  1174. virtual USHORT GetStatusCode(CONNID dwConnID) = 0;
  1175. /* 设置是否使用 Cookie(默认:TRUE) */
  1176. virtual void SetUseCookie(BOOL bUseCookie) = 0;
  1177. /* 检查是否使用 Cookie */
  1178. virtual BOOL IsUseCookie() = 0;
  1179. };
  1180. /************************************************************************
  1181. 名称:复合 Http 响应者组件接口
  1182. 描述:定义复合 Http 响应者组件的所有操作方法和属性访问方法
  1183. ************************************************************************/
  1184. class IComplexHttpResponder : public IComplexHttp
  1185. {
  1186. public:
  1187. /***********************************************************************/
  1188. /***************************** 组件操作方法 *****************************/
  1189. /*
  1190. * 名称:回复请求
  1191. * 描述:向客户端回复 HTTP 请求
  1192. *
  1193. * 参数: dwConnID -- 连接 ID
  1194. * usStatusCode -- HTTP 状态码
  1195. * lpszDesc -- HTTP 状态描述
  1196. * lpHeaders -- 回复请求头
  1197. * iHeaderCount -- 回复请求头数量
  1198. * pData -- 回复请求体
  1199. * iLength -- 回复请求体长度
  1200. * 返回值: TRUE -- 成功
  1201. * FALSE -- 失败
  1202. */
  1203. 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;
  1204. /*
  1205. * 名称:发送本地文件
  1206. * 描述:向指定连接发送 4096 KB 以下的小文件
  1207. *
  1208. * 参数: dwConnID -- 连接 ID
  1209. * lpszFileName -- 文件路径
  1210. * usStatusCode -- HTTP 状态码
  1211. * lpszDesc -- HTTP 状态描述
  1212. * lpHeaders -- 回复请求头
  1213. * iHeaderCount -- 回复请求头数量
  1214. * 返回值: TRUE -- 成功
  1215. * FALSE -- 失败
  1216. */
  1217. virtual BOOL SendLocalFile(CONNID dwConnID, LPCSTR lpszFileName, USHORT usStatusCode = HSC_OK, LPCSTR lpszDesc = nullptr, const THeader lpHeaders[] = nullptr, int iHeaderCount = 0) = 0;
  1218. /*
  1219. * 名称:释放连接
  1220. * 描述:把连接放入释放队列,等待某个时间(通过 SetReleaseDelay() 设置)关闭连接
  1221. *
  1222. * 参数: dwConnID -- 连接 ID
  1223. * 返回值: TRUE -- 成功
  1224. * FALSE -- 失败
  1225. */
  1226. virtual BOOL Release(CONNID dwConnID) = 0;
  1227. public:
  1228. /***********************************************************************/
  1229. /***************************** 属性访问方法 *****************************/
  1230. /* 获取主机 */
  1231. virtual LPCSTR GetHost(CONNID dwConnID) = 0;
  1232. /* 设置连接释放延时(默认:3000 毫秒) */
  1233. virtual void SetReleaseDelay(DWORD dwReleaseDelay) = 0;
  1234. /* 获取连接释放延时 */
  1235. virtual DWORD GetReleaseDelay() = 0;
  1236. /* 获取请求行 URL 域掩码(URL 域参考:EnHttpUrlField) */
  1237. virtual USHORT GetUrlFieldSet(CONNID dwConnID) = 0;
  1238. /* 获取某个 URL 域值 */
  1239. virtual LPCSTR GetUrlField(CONNID dwConnID, EnHttpUrlField enField) = 0;
  1240. /* 获取请求方法 */
  1241. virtual LPCSTR GetMethod(CONNID dwConnID) = 0;
  1242. };
  1243. /************************************************************************
  1244. 名称:简单 HTTP 组件接口
  1245. 描述:定义 简单 HTTP 组件的所有操作方法和属性访问方法
  1246. ************************************************************************/
  1247. class IHttp
  1248. {
  1249. public:
  1250. /***********************************************************************/
  1251. /***************************** 组件操作方法 *****************************/
  1252. /*
  1253. * 名称:发送 WebSocket 消息
  1254. * 描述:向对端端发送 WebSocket 消息
  1255. *
  1256. * 参数: bFinal -- 是否结束帧
  1257. * iReserved -- RSV1/RSV2/RSV3 各 1 位
  1258. * iOperationCode -- 操作码:0x0 - 0xF
  1259. * lpszMask -- 掩码(nullptr 或 4 字节掩码,如果为 nullptr 则没有掩码)
  1260. * pData -- 消息体数据缓冲区
  1261. * iLength -- 消息体数据长度
  1262. * ullBodyLen -- 消息总长度
  1263. * ullBodyLen = 0 -> 消息总长度为 iLength
  1264. * ullBodyLen = iLength -> 消息总长度为 ullBodyLen
  1265. * ullBodyLen > iLength -> 消息总长度为 ullBodyLen,后续消息体长度为 ullBOdyLen - iLength,后续消息体通过底层方法 Send() / SendPackets() 发送
  1266. * ullBodyLen < iLength -> 错误参数,发送失败
  1267. * 返回值: TRUE -- 成功
  1268. * FALSE -- 失败
  1269. */
  1270. virtual BOOL SendWSMessage(BOOL bFinal, BYTE iReserved, BYTE iOperationCode, const BYTE lpszMask[4] = nullptr, BYTE* pData = nullptr, int iLength = 0, ULONGLONG ullBodyLen = 0) = 0;
  1271. public:
  1272. /***********************************************************************/
  1273. /***************************** 属性访问方法 *****************************/
  1274. /* 设置本地协议版本 */
  1275. virtual void SetLocalVersion(EnHttpVersion usVersion) = 0;
  1276. /* 获取本地协议版本 */
  1277. virtual EnHttpVersion GetLocalVersion() = 0;
  1278. /* 检查是否升级协议 */
  1279. virtual BOOL IsUpgrade() = 0;
  1280. /* 检查是否有 Keep-Alive 标识 */
  1281. virtual BOOL IsKeepAlive() = 0;
  1282. /* 获取协议版本 */
  1283. virtual USHORT GetVersion() = 0;
  1284. /* 获取内容长度 */
  1285. virtual ULONGLONG GetContentLength() = 0;
  1286. /* 获取内容类型 */
  1287. virtual LPCSTR GetContentType() = 0;
  1288. /* 获取内容编码 */
  1289. virtual LPCSTR GetContentEncoding() = 0;
  1290. /* 获取传输编码 */
  1291. virtual LPCSTR GetTransferEncoding() = 0;
  1292. /* 获取协议升级类型 */
  1293. virtual EnHttpUpgradeType GetUpgradeType() = 0;
  1294. /* 获取解析错误代码 */
  1295. virtual USHORT GetParseErrorCode(LPCSTR* lpszErrorDesc = nullptr) = 0;
  1296. /* 获取 HTTP 状态码 */
  1297. virtual USHORT GetStatusCode() = 0;
  1298. /* 获取某个请求头(单值) */
  1299. virtual BOOL GetHeader(LPCSTR lpszName, LPCSTR* lpszValue) = 0;
  1300. /* 获取某个请求头(多值) */
  1301. virtual BOOL GetHeaders(LPCSTR lpszName, LPCSTR lpszValue[], DWORD& dwCount) = 0;
  1302. /* 获取所有请求头 */
  1303. virtual BOOL GetAllHeaders(THeader lpHeaders[], DWORD& dwCount) = 0;
  1304. /* 获取所有请求头名称 */
  1305. virtual BOOL GetAllHeaderNames(LPCSTR lpszName[], DWORD& dwCount) = 0;
  1306. /* 获取 Cookie */
  1307. virtual BOOL GetCookie(LPCSTR lpszName, LPCSTR* lpszValue) = 0;
  1308. /* 获取所有 Cookie */
  1309. virtual BOOL GetAllCookies(TCookie lpCookies[], DWORD& dwCount) = 0;
  1310. /*
  1311. // !! maybe implemented in future !! //
  1312. virtual BOOL GetParam(LPCSTR lpszName, LPCSTR* lpszValue) = 0;
  1313. virtual BOOL GetParams(LPCSTR lpszName, LPCSTR lpszValue[], DWORD& dwCount) = 0;
  1314. virtual BOOL GetAllParams(LPPARAM lpszParam[], DWORD& dwCount) = 0;
  1315. virtual BOOL GetAllParamNames(LPCSTR lpszName[], DWORD& dwCount) = 0;
  1316. */
  1317. /* 获取当前 WebSocket 消息状态,传入 nullptr 则不获取相应字段 */
  1318. virtual BOOL GetWSMessageState(BOOL* lpbFinal, BYTE* lpiReserved, BYTE* lpiOperationCode, LPCBYTE* lpszMask, ULONGLONG* lpullBodyLen, ULONGLONG* lpullBodyRemain) = 0;
  1319. public:
  1320. virtual ~IHttp() {}
  1321. };
  1322. /************************************************************************
  1323. 名称:简单 Http 请求者组件接口
  1324. 描述:定义简单 Http 请求者组件的所有操作方法和属性访问方法
  1325. ************************************************************************/
  1326. class IHttpRequester : public IHttp
  1327. {
  1328. public:
  1329. /***********************************************************************/
  1330. /***************************** 组件操作方法 *****************************/
  1331. /*
  1332. * 名称:发送请求
  1333. * 描述:向服务端发送 HTTP 请求
  1334. *
  1335. * 参数: lpszMethod -- 请求方法
  1336. * lpszPath -- 请求路径
  1337. * lpHeaders -- 请求头
  1338. * iHeaderCount -- 请求头数量
  1339. * pBody -- 请求体
  1340. * iLength -- 请求体长度
  1341. * 返回值: TRUE -- 成功
  1342. * FALSE -- 失败
  1343. */
  1344. virtual BOOL SendRequest(LPCSTR lpszMethod, LPCSTR lpszPath, const THeader lpHeaders[] = nullptr, int iHeaderCount = 0, const BYTE* pBody = nullptr, int iLength = 0) = 0;
  1345. /*
  1346. * 名称:发送本地文件
  1347. * 描述:向指定连接发送 4096 KB 以下的小文件
  1348. *
  1349. * 参数: dwConnID -- 连接 ID
  1350. * lpszFileName -- 文件路径
  1351. * lpszMethod -- 请求方法
  1352. * lpszPath -- 请求路径
  1353. * lpHeaders -- 请求头
  1354. * iHeaderCount -- 请求头数量
  1355. * 返回值: TRUE -- 成功
  1356. * FALSE -- 失败
  1357. */
  1358. virtual BOOL SendLocalFile(LPCSTR lpszFileName, LPCSTR lpszMethod, LPCSTR lpszPath, const THeader lpHeaders[] = nullptr, int iHeaderCount = 0) = 0;
  1359. /* 发送 POST 请求 */
  1360. virtual BOOL SendPost(LPCSTR lpszPath, const THeader lpHeaders[], int iHeaderCount, const BYTE* pBody, int iLength) = 0;
  1361. /* 发送 PUT 请求 */
  1362. virtual BOOL SendPut(LPCSTR lpszPath, const THeader lpHeaders[], int iHeaderCount, const BYTE* pBody, int iLength) = 0;
  1363. /* 发送 PATCH 请求 */
  1364. virtual BOOL SendPatch(LPCSTR lpszPath, const THeader lpHeaders[], int iHeaderCount, const BYTE* pBody, int iLength) = 0;
  1365. /* 发送 GET 请求 */
  1366. virtual BOOL SendGet(LPCSTR lpszPath, const THeader lpHeaders[] = nullptr, int iHeaderCount = 0) = 0;
  1367. /* 发送 DELETE 请求 */
  1368. virtual BOOL SendDelete(LPCSTR lpszPath, const THeader lpHeaders[] = nullptr, int iHeaderCount = 0) = 0;
  1369. /* 发送 HEAD 请求 */
  1370. virtual BOOL SendHead(LPCSTR lpszPath, const THeader lpHeaders[] = nullptr, int iHeaderCount = 0) = 0;
  1371. /* 发送 TRACE 请求 */
  1372. virtual BOOL SendTrace(LPCSTR lpszPath, const THeader lpHeaders[] = nullptr, int iHeaderCount = 0) = 0;
  1373. /* 发送 OPTIONS 请求 */
  1374. virtual BOOL SendOptions(LPCSTR lpszPath, const THeader lpHeaders[] = nullptr, int iHeaderCount = 0) = 0;
  1375. /* 发送 CONNECT 请求 */
  1376. virtual BOOL SendConnect(LPCSTR lpszHost, const THeader lpHeaders[] = nullptr, int iHeaderCount = 0) = 0;
  1377. public:
  1378. /***********************************************************************/
  1379. /***************************** 属性访问方法 *****************************/
  1380. /* 设置是否使用 Cookie(默认:TRUE) */
  1381. virtual void SetUseCookie(BOOL bUseCookie) = 0;
  1382. /* 检查是否使用 Cookie */
  1383. virtual BOOL IsUseCookie() = 0;
  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. };
  1709. /************************************************************************
  1710. 名称:IHttpClientListener 监听器抽象基类
  1711. 描述:定义某些事件的默认处理方法(忽略事件)
  1712. ************************************************************************/
  1713. class CHttpSyncClientListener : public CHttpClientListener
  1714. {
  1715. public:
  1716. virtual EnHandleResult OnClose(ITcpClient* pSender, CONNID dwConnID, EnSocketOperation enOperation, int iErrorCode) {return HR_IGNORE;}
  1717. virtual EnHttpParseResult OnHeadersComplete(IHttpClient* pSender, CONNID dwConnID) {return HPR_OK;}
  1718. virtual EnHttpParseResult OnBody(IHttpClient* pSender, CONNID dwConnID, const BYTE* pData, int iLength) {return HPR_OK;}
  1719. virtual EnHttpParseResult OnMessageComplete(IHttpClient* pSender, CONNID dwConnID) {return HPR_OK;}
  1720. virtual EnHttpParseResult OnParseError(IHttpClient* pSender, CONNID dwConnID, int iErrorCode, LPCSTR lpszErrorDesc) {return HPR_OK;}
  1721. };