Session.h 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. /*
  2. * Copyright (c) 2021 The ZLToolKit project authors. All Rights Reserved.
  3. *
  4. * This file is part of ZLToolKit(https://github.com/ZLMediaKit/ZLToolKit).
  5. *
  6. * Use of this source code is governed by MIT license that can be found in the
  7. * LICENSE file in the root of the source tree. All contributing project authors
  8. * may be found in the AUTHORS file in the root of the source tree.
  9. */
  10. #ifndef ZLTOOLKIT_SESSION_H
  11. #define ZLTOOLKIT_SESSION_H
  12. #include <memory>
  13. #include "Network/Socket.h"
  14. #include "Util/util.h"
  15. namespace toolkit {
  16. // 会话, 用于存储一对客户端与服务端间的关系
  17. class Server;
  18. class Session : public std::enable_shared_from_this<Session>, public SocketHelper {
  19. public:
  20. typedef std::shared_ptr<Session> Ptr;
  21. Session(const Socket::Ptr &sock);
  22. ~Session() override;
  23. /**
  24. * 接收数据入口
  25. * @param buf 数据,可以重复使用内存区
  26. */
  27. virtual void onRecv(const Buffer::Ptr &buf) = 0;
  28. /**
  29. * 收到 eof 或其他导致脱离 Server 事件的回调
  30. * 收到该事件时, 该对象一般将立即被销毁
  31. * @param err 原因
  32. */
  33. virtual void onErr(const SockException &ex) = 0;
  34. /**
  35. * 每隔一段时间触发, 用来做超时管理
  36. */
  37. virtual void onManager() = 0;
  38. /**
  39. * 在创建 Session 后, Server 会把自身的配置参数通过该函数传递给 Session
  40. * @param server, 服务器对象
  41. */
  42. virtual void attachServer(const Server &) {}
  43. /**
  44. * 作为该 Session 的唯一标识符
  45. * @return 唯一标识符
  46. */
  47. std::string getIdentifier() const override;
  48. /**
  49. * 线程安全的脱离 Server 并触发 onError 事件
  50. * @param ex 触发 onError 事件的原因
  51. */
  52. void safeShutdown(const SockException &ex = SockException(Err_shutdown, "self shutdown"));
  53. private:
  54. // 对象个数统计
  55. ObjectStatistic<Session> _statistic;
  56. };
  57. //TCP服务器连接对象,一个tcp连接对应一个TcpSession对象
  58. class TcpSession : public Session {
  59. public:
  60. using Ptr = std::shared_ptr<TcpSession>;
  61. TcpSession(const Socket::Ptr &sock) : Session(sock) {}
  62. ~TcpSession() override = default;
  63. Ptr shared_from_this() {
  64. return static_pointer_cast<TcpSession>(Session::shared_from_this());
  65. }
  66. private:
  67. // 对象个数统计
  68. ObjectStatistic<TcpSession> _statistic;
  69. };
  70. //UDP服务器连接对象,一个udp peer对应一个UdpSession对象
  71. class UdpSession : public Session {
  72. public:
  73. using Ptr = std::shared_ptr<UdpSession>;
  74. UdpSession(const Socket::Ptr &sock) : Session(sock){}
  75. ~UdpSession() override = default;
  76. Ptr shared_from_this() {
  77. return static_pointer_cast<UdpSession>(Session::shared_from_this());
  78. }
  79. private:
  80. // 对象个数统计
  81. ObjectStatistic<UdpSession> _statistic;
  82. };
  83. } // namespace toolkit
  84. #endif // ZLTOOLKIT_SESSION_H