TcpServer.h 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. /*
  2. * Copyright (c) 2016 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 TCPSERVER_TCPSERVER_H
  11. #define TCPSERVER_TCPSERVER_H
  12. #include <memory>
  13. #include <functional>
  14. #include <unordered_map>
  15. #include "Server.h"
  16. #include "Session.h"
  17. #include "Poller/Timer.h"
  18. #include "Util/util.h"
  19. namespace toolkit {
  20. //TCP服务器,可配置的;配置通过Session::attachServer方法传递给会话对象
  21. class TcpServer : public Server {
  22. public:
  23. using Ptr = std::shared_ptr<TcpServer>;
  24. /**
  25. * 创建tcp服务器,listen fd的accept事件会加入到所有的poller线程中监听
  26. * 在调用TcpServer::start函数时,内部会创建多个子TcpServer对象,
  27. * 这些子TcpServer对象通过Socket对象克隆的方式在多个poller线程中监听同一个listen fd
  28. * 这样这个TCP服务器将会通过抢占式accept的方式把客户端均匀的分布到不同的poller线程
  29. * 通过该方式能实现客户端负载均衡以及提高连接接收速度
  30. */
  31. explicit TcpServer(const EventPoller::Ptr &poller = nullptr);
  32. ~TcpServer() override;
  33. /**
  34. * @brief 开始tcp server
  35. * @param port 本机端口,0则随机
  36. * @param host 监听网卡ip
  37. * @param backlog tcp listen backlog
  38. */
  39. template<typename SessionType>
  40. void start(uint16_t port, const std::string &host = "::", uint32_t backlog = 1024) {
  41. static std::string cls_name = toolkit::demangle(typeid(SessionType).name());
  42. //Session创建器,通过它创建不同类型的服务器
  43. _session_alloc = [](const TcpServer::Ptr &server, const Socket::Ptr &sock) {
  44. auto session = std::shared_ptr<SessionType>(new SessionType(sock), [](SessionType * ptr) {
  45. TraceP(static_cast<Session *>(ptr)) << "~" << cls_name;
  46. delete ptr;
  47. });
  48. TraceP(static_cast<Session *>(session.get())) << cls_name;
  49. session->setOnCreateSocket(server->_on_create_socket);
  50. return std::make_shared<SessionHelper>(server, std::move(session), cls_name);
  51. };
  52. start_l(port, host, backlog);
  53. }
  54. /**
  55. * @brief 获取服务器监听端口号, 服务器可以选择监听随机端口
  56. */
  57. uint16_t getPort();
  58. /**
  59. * @brief 自定义socket构建行为
  60. */
  61. void setOnCreateSocket(Socket::onCreateSocket cb);
  62. /**
  63. * 根据socket对象创建Session对象
  64. * 需要确保在socket归属poller线程执行本函数
  65. */
  66. Session::Ptr createSession(const Socket::Ptr &socket);
  67. protected:
  68. virtual void cloneFrom(const TcpServer &that);
  69. virtual TcpServer::Ptr onCreatServer(const EventPoller::Ptr &poller);
  70. virtual Session::Ptr onAcceptConnection(const Socket::Ptr &sock);
  71. virtual Socket::Ptr onBeforeAcceptConnection(const EventPoller::Ptr &poller);
  72. private:
  73. void onManagerSession();
  74. Socket::Ptr createSocket(const EventPoller::Ptr &poller);
  75. void start_l(uint16_t port, const std::string &host, uint32_t backlog);
  76. Ptr getServer(const EventPoller *) const;
  77. void setupEvent();
  78. private:
  79. bool _is_on_manager = false;
  80. const TcpServer *_parent = nullptr;
  81. Socket::Ptr _socket;
  82. std::shared_ptr<Timer> _timer;
  83. Socket::onCreateSocket _on_create_socket;
  84. std::unordered_map<SessionHelper *, SessionHelper::Ptr> _session_map;
  85. std::function<SessionHelper::Ptr(const TcpServer::Ptr &server, const Socket::Ptr &)> _session_alloc;
  86. std::unordered_map<const EventPoller *, Ptr> _cloned_server;
  87. //对象个数统计
  88. ObjectStatistic<TcpServer> _statistic;
  89. };
  90. } /* namespace toolkit */
  91. #endif /* TCPSERVER_TCPSERVER_H */