tc_transceiver.h 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724
  1. /**
  2. * Tencent is pleased to support the open source community by making Tars available.
  3. *
  4. * Copyright (C) 2016THL A29 Limited, a Tencent company. All rights reserved.
  5. *
  6. * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except
  7. * in compliance with the License. You may obtain a copy of the License at
  8. *
  9. * https://opensource.org/licenses/BSD-3-Clause
  10. *
  11. * Unless required by applicable law or agreed to in writing, software distributed
  12. * under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
  13. * CONDITIONS OF ANY KIND, either express or implied. See the License for the
  14. * specific language governing permissions and limitations under the License.
  15. */
  16. #ifndef TC_CPP_TRANSCEIVER_H
  17. #define TC_CPP_TRANSCEIVER_H
  18. #include <list>
  19. #include "util/tc_network_buffer.h"
  20. #include "util/tc_clientsocket.h"
  21. #include "util/tc_epoller.h"
  22. #include "util/tc_proxy_info.h"
  23. namespace tars
  24. {
  25. class TC_OpenSSL;
  26. /**
  27. * @brief 连接异常类
  28. */
  29. struct TC_Transceiver_Exception : public TC_Exception
  30. {
  31. TC_Transceiver_Exception(const string &sBuffer) : TC_Exception(sBuffer){};
  32. TC_Transceiver_Exception(const string &sBuffer, int err) : TC_Exception(sBuffer, err){};
  33. ~TC_Transceiver_Exception() throw(){};
  34. };
  35. /**
  36. * 网络传输基类
  37. * 使用方式说明:
  38. * 1 通过暴露注册回调的机制来和使用方交互, 配和epoller类完成网路层的收发都统一, epoller对象需要使用者自己创建和管理, 并传递给TC_Transceiver
  39. * 2 即可支持客户端的网络, 也可以支持服务端的网络, 但是两者初始化过程是有区别的(initializeClient & initializeServer)
  40. * 客户端网络: 发送connect时, 会创建句柄, 有oncreate_callback调用到业务层, 通过参数将TC_Epoller::EpollInfo*给业务层, 业务层在回调中根据实际情况完成epoll事件函数的注册
  41. * 服务端网络: 调用者完成accept, 然后通过bindFd的形式, 将句柄传递进来, bindFd会创建TC_Epoller::EpollInfo*, 返回给调用方
  42. * 3 无论是客户端网络还是服务端网络, 使用者都不用管理TC_Epoller::EpollInfo*的生命周期, 它会被TC_Transceiver管理, 连接关闭时释放
  43. * 4 作为客户端, 支持sock4/sock5/http代理(通过oncreate_callback回调, 业务层将代理信息TC_ProxyInfo返回给TC_Transceiver), 也可以通过setBindAddr指定客户端发包时的绑定地址
  44. * 5 在数据包的管理上, TC_Transceiver内只保存最后一个发送的数据包(可能发送了一半), 因此调用者需要维持发送的数据包队列, 几个回调函数的说明:
  45. * oncreate_callback: 只存在于客户端模式, 当TC_Transceiver创建完客户端fd时回调oncreate_callback, 使用者在回调事件中监听fd事件, 如果有代理, 则返回代理信息, 否则返回null(注意, 如果有, 则没法都要new一个新的, 因为代理是具备状态信息的)
  46. * onconnect_callback: 建立连接以后的回调, 注意对于ssl, 是指已经完成ssl握手后的回调
  47. * onsend_callback: 当TC_Transceiver内的数据都发送完毕, 则回调onsend_callback, 使得调用者可以发送下一个数据
  48. * onrequest_callback: 该回调表示网络层的连接建立完毕(如果SSL则表示SSL握手完成), 可以发送业务层队列的数据了(通过sendRequest来发送)
  49. * onopenssl_callback: 需要常见openssl的对象回调, 业务层完成openssl对象的创建(因为涉及证书管理, 因此丢该业务层来创建)
  50. * onparser_callback: 协议解析的回调
  51. * onclose_callback: 关闭socket的回调(在close句柄之前回调的)
  52. * 这种连接中只有最后一个数据包的模式, 保证当连接异常时,在调用者队列中还没有发送的数据能够通过其他连接来发送
  53. * 6 发送数据使用sendRequest函数, 注意返回值
  54. * eRetError: 表示发送失败, 当前的数据包没有发送出去, 需要检查连接有有效性, 如果有效: isValid, 则数据需要进入使用自己的队列, onsend_callback回调的时候再发送
  55. * eRetOk: 发送成功
  56. * eRetFull: 发送了一半, 系统网络buff满了, 即当前fd不能再发送数据了, 等EPOLLOUT事件来的时候, 业务层再发送
  57. * eRetNotSend: 数据没有发送(比如连接还没有建立, ssl没有握手, 没有鉴权等), 业务层可以缓存此数据, 等可以发送时onrequest_callback会被回调
  58. * 7 注册事件, 客户端在oncreate_callback回调中注册相关事件, 服务端在accept句柄并bindFd之后, 来注册事件, 通常需要注册三个事件
  59. *
  60. * 8 注意: 主要接口都以异常的形式对外抛出错误, 因此外部调用时注意捕获异常(一般是在注册的事件中)
  61. * 9 连接直接鉴权逻辑, 即可客户端发业务包前, 会发送一个鉴权包到服务器端, 服务器收到同样解包, 鉴权通过后, 才能继续发送业务包
  62. * 10 具体客户端使用方式可以参考: CommunicatorEpoll类, 服务端参考: tc_epoll_server
  63. *
  64. */
  65. class TC_Transceiver
  66. {
  67. public:
  68. /**
  69. * 连接状态
  70. */
  71. enum ConnectStatus
  72. {
  73. eUnconnected,
  74. eConnecting,
  75. eConnected,
  76. };
  77. /**
  78. * sendRequest返回值
  79. */
  80. enum ReturnStatus
  81. {
  82. eRetError = -1,
  83. eRetOk =0,
  84. eRetFull=1,
  85. eRetNotSend = 2,
  86. };
  87. /**
  88. * 连接关闭原因
  89. */
  90. enum CloseReason
  91. {
  92. CR_Type = 0, //连接类型错误
  93. CR_Connect = 1, //连接出错
  94. CR_ConnectTimeout = 2, //连接超时
  95. CR_SSL = 3, //ssl错误
  96. CR_PROXY_SEND = 4, //代理模式下, 发送包错误
  97. CR_PROXY_RECV = 5, //代理模式下, 接收包错误
  98. CR_PROTOCOL = 6, //协议解析错误
  99. CR_SEND = 7, //发送错误
  100. CR_RECV = 8, //接收错误
  101. CR_ACTIVE = 9, //主动调用close触发
  102. CR_DECONSTRUCTOR = 10, //析构
  103. CR_SSL_HANDSHAKE = 11, //ssl handshake错误
  104. };
  105. /**
  106. * 鉴权状态
  107. */
  108. enum AUTH_STATUS
  109. {
  110. eAuthInit = -127,
  111. eAuthSucc = 0,
  112. };
  113. enum
  114. {
  115. DEFAULT_RECV_BUFFERSIZE = 64*1024 /*缺省数据接收buffer的大小*/
  116. };
  117. struct SocketOpt
  118. {
  119. int level;
  120. int optname;
  121. const void *optval;
  122. SOCKET_LEN_TYPE optlen;
  123. };
  124. //发起连接前, 创建网络句柄后的回调(只对客户端有效)
  125. using oncreate_callback = std::function<shared_ptr<TC_ProxyInfo>(TC_Transceiver*)>;
  126. //开启openssl对象的回调
  127. using onopenssl_callback = std::function<std::shared_ptr<TC_OpenSSL>(TC_Transceiver*)>;
  128. //关闭句柄的回调
  129. using onclose_callback = std::function<void(TC_Transceiver*, CloseReason reason, const string &err)> ;
  130. //建立连接上的回调(只对客户端有效)
  131. using onconnect_callback = std::function<void(TC_Transceiver*)> ;
  132. //可以发出业务请求了(对客户端: 连接建立完成, 对SSL: 握手完成, 可以发业务数据的回调)
  133. using onrequest_callback = std::function<void(TC_Transceiver*)> ;
  134. //解析协议的回调
  135. using onparser_callback = std::function<TC_NetWorkBuffer::PACKET_TYPE(TC_NetWorkBuffer&, TC_Transceiver*)> ;
  136. //完整解析完一个包之后的回调
  137. using oncompletepackage_callback = std::function<void(TC_Transceiver*)> ;
  138. //cient侧: 发送鉴权包的回调, 业务层在回调里面组织鉴权包
  139. using onclientsendauth_callback = std::function<shared_ptr<TC_NetWorkBuffer::Buffer>(TC_Transceiver*)> ;
  140. //client侧: 收到鉴权包的的回调, 业务层解包(注意返回PACKET_FULL, 表示鉴权成功)
  141. using onclientverifyauth_callback = std::function<TC_NetWorkBuffer::PACKET_TYPE(TC_NetWorkBuffer &, TC_Transceiver*)> ;
  142. //server侧: 验证鉴权包并返回验证包的回调
  143. using onserververifyauth_callback = std::function<pair<TC_NetWorkBuffer::PACKET_TYPE, shared_ptr<TC_NetWorkBuffer::Buffer>>(TC_NetWorkBuffer &, TC_Transceiver*)> ;
  144. /**
  145. * 构造函数
  146. * @param epoller
  147. * @param ep, 服务端地址
  148. */
  149. TC_Transceiver(TC_Epoller* epoller, const TC_Endpoint &ep);
  150. /**
  151. *
  152. *析构函数
  153. */
  154. virtual ~TC_Transceiver();
  155. /**
  156. *
  157. * 初始化客户端的连接
  158. * 句柄是connect时创建的
  159. */
  160. void initializeClient(const oncreate_callback &oncreate,
  161. const onclose_callback &onclose,
  162. const onconnect_callback &onconnect,
  163. const onrequest_callback &onrequest,
  164. const onparser_callback &onparser,
  165. const onopenssl_callback &onopenssl,
  166. const oncompletepackage_callback &onfinish = oncompletepackage_callback());
  167. /**
  168. *
  169. * 初始化服务端的连接
  170. * 句柄是外部accept后, 传递进去的
  171. */
  172. void initializeServer(const onclose_callback &onclose,
  173. const onrequest_callback &onrequest,
  174. const onparser_callback &onparser,
  175. const onopenssl_callback &onopenssl,
  176. const oncompletepackage_callback &onfinish = oncompletepackage_callback());
  177. /**
  178. * 设置绑定地址(对客户端有效, 服务端本身就是绑定的)
  179. */
  180. void setBindAddr(const char *host);
  181. /**
  182. * 设置绑定地址(对客户端有效, 服务端本身就是绑定的)
  183. * @param bindAddr
  184. */
  185. void setBindAddr(const TC_Socket::addr_type &bindAddr);
  186. /**
  187. * 获取client地址, 如果是udp, 则表示最后一个包对应的client地址
  188. * @return
  189. */
  190. const TC_Socket::addr_type & getClientAddr() const { return _clientAddr; }
  191. /**
  192. * 获取server地址(如果是客户端, 并设置了代理, 则返回代理地址)
  193. * @return
  194. */
  195. const TC_Socket::addr_type & getServerAddr() const { return _serverAddr; }
  196. /**
  197. * 设置鉴权回调(不需要鉴权逻辑, 则不需要处理这一步)
  198. */
  199. void setClientAuthCallback(const onclientsendauth_callback &onsendauth, const onclientverifyauth_callback &onverify);
  200. /**
  201. * 设置鉴权回调(不需要鉴权逻辑, 则不需要处理这一步)
  202. */
  203. void setServerAuthCallback(const onserververifyauth_callback &onverify);
  204. /**
  205. * 绑定fd上, 一旦绑定, 就创建对fd的事件监听EPOLLIN|EPOLLOUT
  206. * 并且会维持句柄的持有
  207. * @param fd
  208. * @return TC_Epoller::EpollInfo*
  209. */
  210. shared_ptr<TC_Epoller::EpollInfo> bindFd(int fd);
  211. /**
  212. * 设置udp接收buffer大小(只对udp有效)
  213. */
  214. void setUdpRecvBuffer(size_t nSize);
  215. /**
  216. * 设置socket opt
  217. */
  218. void setSocketOpt(const vector<SocketOpt> &socketOpts) { _socketOpts = socketOpts; }
  219. /**
  220. * 是否ssl
  221. */
  222. bool isSSL() const ;
  223. /**
  224. * 创建连接
  225. */
  226. void connect();
  227. /*
  228. * 关闭连接
  229. */
  230. void close();
  231. /**
  232. * send buffer
  233. * @return
  234. */
  235. inline TC_NetWorkBuffer &getSendBuffer() { return _sendBuffer; }
  236. /**
  237. * recv buffer
  238. * @return
  239. */
  240. inline TC_NetWorkBuffer &getRecvBuffer() { return _recvBuffer; }
  241. /**
  242. * get epoll info
  243. */
  244. inline const shared_ptr<TC_Epoller::EpollInfo> &getEpollInfo() { return _epollInfo; }
  245. /**
  246. * 发送buffer
  247. * @param buff, buffer内容
  248. * @param addr, 发送地址(注意如果udp server, 回包一定要指向客户端的地址, 其他情况可以不传入这个地址)
  249. */
  250. virtual ReturnStatus sendRequest(const shared_ptr<TC_NetWorkBuffer::Buffer> &buff, const TC_Socket::addr_type& addr = TC_Socket::addr_type());
  251. /**
  252. * 是否鉴权成功
  253. */
  254. bool isAuthSucc() const { return _authState == eAuthSucc; }
  255. /**
  256. * 鉴权成功
  257. */
  258. void enableAuthSucc() { _authState = eAuthSucc; }
  259. /**
  260. * 授权状态值
  261. */
  262. inline AUTH_STATUS getAuthStatus() const { return _authState; }
  263. /*
  264. * 发送链接中已经有数据, 如果连接数据都已经发送完毕, 则会回调onrequest_callback
  265. * @return int throw TC_Transceiver_Exception
  266. */
  267. void doRequest();
  268. /*
  269. * 接受网络请求
  270. * @return throw TC_Transceiver_Exception
  271. */
  272. virtual void doResponse() = 0;
  273. /*
  274. * 获取文件描述符
  275. * @return int
  276. */
  277. inline int fd() const { return _fd; }
  278. /*
  279. * 是否有效
  280. */
  281. inline bool isValid() const { return (_fd != -1); }
  282. /*
  283. * 获取端口信息(服务器地址)
  284. */
  285. inline const TC_Endpoint& getEndpoint() const { return _ep; }
  286. /**
  287. * 获取openssl
  288. */
  289. inline const std::shared_ptr<TC_OpenSSL>& getOpenSSL() { return _openssl; }
  290. /*
  291. * 判断是否已经连接到服务端
  292. */
  293. inline bool hasConnected() { return isValid() && (_connStatus == eConnected); }
  294. /*
  295. * 判断是否正在连接
  296. */
  297. inline bool isConnecting() { return isValid() && (_connStatus == eConnecting); }
  298. /**
  299. * 获取连接地址
  300. * @return
  301. */
  302. inline const TC_Endpoint &getConnectEndpoint() const { return _proxyInfo? _proxyInfo->getEndpoint() : _ep; }
  303. /**
  304. * 端口描述
  305. */
  306. inline const string& getConnectionString() const { return _desc; }
  307. /**
  308. * @brief is ipv6 socket or not
  309. * @return true if is ipv6
  310. */
  311. inline bool isConnectIPv6() const { return getConnectEndpoint().isIPv6(); }
  312. /**
  313. * 设置连接超时时间(tcp下才有效)
  314. */
  315. void setConnTimeout(int connTimeout) { _connTimeout = connTimeout; }
  316. /**
  317. * 连接超时的时间(tcp下才有效)
  318. */
  319. int getConnTimeout() const { return _connTimeout; };
  320. /**
  321. * 连接是否超时(tcp下才有效)
  322. */
  323. inline bool isConnTimeout() const { return _isConnTimeout; }
  324. /**
  325. *
  326. * @param connTimeout
  327. * @return
  328. */
  329. inline void setIsConnTimeout(bool connTimeout) { _isConnTimeout = connTimeout; }
  330. protected:
  331. /**
  332. * create socket
  333. */
  334. int createSocket(bool udp, bool isLocal = false, bool isIpv6 = false);
  335. /**
  336. * connect
  337. */
  338. bool doConnect(int, const struct sockaddr *, socklen_t len);
  339. /**
  340. * check connect
  341. */
  342. void checkConnect();
  343. /*
  344. * 设置当前连接态
  345. */
  346. void setConnected();
  347. /*
  348. * 设置当前连接态
  349. */
  350. void onSetConnected();
  351. /**
  352. * 检查连接超时
  353. */
  354. void checkConnectTimeout();
  355. /**
  356. ** 物理连接成功回调
  357. **/
  358. void onConnect();
  359. /**
  360. ** 发送打通代理请求
  361. **/
  362. void connectProxy();
  363. /**
  364. * 检查是否代理创建成功
  365. * @param buff
  366. * @param length
  367. * @return <0: 失败, 0: 成功: 1: 需要验证
  368. */
  369. int doCheckProxy(const char *buff, size_t length);
  370. /**
  371. * 解析域名
  372. */
  373. void parseConnectAddress();
  374. /**
  375. * 发送鉴权代码
  376. */
  377. void doAuthReq();
  378. /**
  379. * 验证鉴权信息
  380. */
  381. void doAuthCheck(TC_NetWorkBuffer *buff);
  382. /**
  383. * 解析协议
  384. */
  385. int doProtocolAnalysis(TC_NetWorkBuffer *buff);
  386. /*
  387. * 内部关闭连接, udp连接不关闭
  388. */
  389. void tcpClose(bool deconstructor, CloseReason reason, const string &err);
  390. /**
  391. * udp Close
  392. */
  393. void udpClose();
  394. /*
  395. * 网络发送接口
  396. * @param buf
  397. * @param len
  398. * @param flag
  399. * @return int
  400. */
  401. virtual int send(const void* buf, uint32_t len, uint32_t flag) = 0;
  402. /*
  403. * 网络接收接口
  404. * @param buf
  405. * @param len
  406. * @param flag
  407. *
  408. * @return int
  409. */
  410. virtual int recv(void* buf, uint32_t len, uint32_t flag) = 0;
  411. friend class CloseClourse;
  412. protected:
  413. /*
  414. * 服务端的地址
  415. */
  416. TC_Socket::addr_type _serverAddr;
  417. /**
  418. * 客户端地址
  419. */
  420. TC_Socket::addr_type _clientAddr;
  421. /**
  422. * bind addr
  423. */
  424. TC_Socket::addr_type _bindAddr;
  425. /*
  426. * epoller
  427. */
  428. TC_Epoller* _epoller = NULL;
  429. /*
  430. * 连接的节点信息(服务端地址)
  431. */
  432. TC_Endpoint _ep;
  433. /*
  434. * 端口描述
  435. */
  436. string _desc;
  437. /*
  438. * 套接字
  439. */
  440. int _fd;
  441. /**
  442. * true: server端, false: 客户端
  443. */
  444. bool _isServer;
  445. /**
  446. * socket选项
  447. */
  448. vector<SocketOpt> _socketOpts;
  449. /*
  450. * 事件注册信息
  451. */
  452. shared_ptr<TC_Epoller::EpollInfo> _epollInfo;
  453. /*
  454. * 连接状态
  455. */
  456. ConnectStatus _connStatus;
  457. /*
  458. * openssl
  459. */
  460. std::shared_ptr<TC_OpenSSL> _openssl;
  461. /*
  462. * 发送buffer
  463. */
  464. TC_NetWorkBuffer _sendBuffer;
  465. /*
  466. * 接收buffer
  467. */
  468. TC_NetWorkBuffer _recvBuffer;
  469. /**
  470. * 代理
  471. */
  472. shared_ptr<TC_ProxyInfo> _proxyInfo;
  473. /*
  474. * 鉴权状态
  475. */
  476. AUTH_STATUS _authState = eAuthInit;
  477. /**
  478. * 最后一个包的发送地址
  479. */
  480. TC_Socket::addr_type _lastAddr;
  481. /*
  482. * 接收缓存(udp情况才有效)
  483. */
  484. shared_ptr<TC_NetWorkBuffer::Buffer> _pRecvBuffer;
  485. /*
  486. * 接收缓存大小(udp情况才有效)
  487. */
  488. size_t _nRecvBufferSize = DEFAULT_RECV_BUFFERSIZE;
  489. /**
  490. * 是否超时
  491. */
  492. bool _isConnTimeout = false;
  493. /**
  494. * 连接超时时间
  495. */
  496. int _connTimeout = 5000;
  497. int64_t _connTimerId = 0;
  498. oncreate_callback _createSocketCallback;
  499. onopenssl_callback _onOpensslCallback;
  500. onconnect_callback _onConnectCallback;
  501. onrequest_callback _onRequestCallback;
  502. onclose_callback _onCloseCallback;
  503. onparser_callback _onParserCallback;
  504. oncompletepackage_callback _onCompletePackageCallback;
  505. onclientsendauth_callback _onClientSendAuthCallback;
  506. onclientverifyauth_callback _onClientVerifyAuthCallback;
  507. onserververifyauth_callback _onServerVerifyAuthCallback;
  508. };
  509. //////////////////////////////////////////////////////////
  510. /**
  511. * TCP 传输实现
  512. */
  513. class TC_TCPTransceiver : public TC_Transceiver
  514. {
  515. public:
  516. /**
  517. * 构造函数
  518. * @param ep
  519. * @param fd
  520. */
  521. TC_TCPTransceiver(TC_Epoller* epoller, const TC_Endpoint &ep);
  522. /**
  523. * TCP 发送实现
  524. * @param buf
  525. * @param len
  526. * @param flag
  527. * @return int
  528. */
  529. virtual int send(const void* buf, uint32_t len, uint32_t flag);
  530. /**
  531. * TCP 接收实现
  532. * @param buf
  533. * @param len
  534. * @param flag
  535. *
  536. * @return int
  537. */
  538. virtual int recv(void* buf, uint32_t len, uint32_t flag);
  539. /**
  540. * 处理返回,判断Recv BufferCache是否有完整的包
  541. * @return throw
  542. */
  543. virtual void doResponse();
  544. };
  545. //////////////////////////////////////////////////////////
  546. /**
  547. * SSL 传输实现
  548. */
  549. class TC_SSLTransceiver : public TC_TCPTransceiver
  550. {
  551. public:
  552. /**
  553. * 构造函数
  554. * @param ep
  555. * @param fd
  556. */
  557. TC_SSLTransceiver(TC_Epoller* epoller, const TC_Endpoint &ep);
  558. /**
  559. * 处理返回
  560. * @return throw
  561. */
  562. virtual void doResponse();
  563. };
  564. //////////////////////////////////////////////////////////
  565. /**
  566. * UDP 传输实现
  567. */
  568. class TC_UDPTransceiver : public TC_Transceiver
  569. {
  570. public:
  571. /**
  572. * 构造函数
  573. */
  574. TC_UDPTransceiver(TC_Epoller* epoller, const TC_Endpoint &ep);
  575. /**
  576. * 析构函数
  577. */
  578. ~TC_UDPTransceiver();
  579. /**
  580. * UDP 发送实现
  581. * @param buf
  582. * @param len
  583. * @param flag
  584. * @return int
  585. */
  586. virtual int send(const void* buf, uint32_t len, uint32_t flag);
  587. /**
  588. * UDP 接收实现
  589. * @param buf
  590. * @param len
  591. * @param flag
  592. * @return int
  593. */
  594. virtual int recv(void* buf, uint32_t len, uint32_t flag);
  595. /**
  596. * 处理返回,判断Recv BufferCache是否有完整的包
  597. * @return throw
  598. */
  599. virtual void doResponse();
  600. protected:
  601. };
  602. }
  603. #endif