You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

tcp_server.h 3.8 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. /**
  2. * Copyright 2020 Huawei Technologies Co., Ltd
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License");
  5. * you may not use this file except in compliance with the License.
  6. * You may obtain a copy of the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS,
  12. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. * See the License for the specific language governing permissions and
  14. * limitations under the License.
  15. */
  16. #ifndef MINDSPORE_CCSRC_PS_COMM_TCP_SERVER_H_
  17. #define MINDSPORE_CCSRC_PS_COMM_TCP_SERVER_H_
  18. #include <event2/buffer.h>
  19. #include <event2/bufferevent.h>
  20. #include <event2/event.h>
  21. #include <event2/listener.h>
  22. #include <exception>
  23. #include <functional>
  24. #include <iostream>
  25. #include <map>
  26. #include <mutex>
  27. #include <string>
  28. #include "utils/log_adapter.h"
  29. #include "ps/comm/tcp_message_handler.h"
  30. namespace mindspore {
  31. namespace ps {
  32. namespace comm {
  33. class TcpServer;
  34. class TcpConnection {
  35. public:
  36. TcpConnection() : buffer_event_(nullptr), fd_(0), server_(nullptr) {}
  37. virtual ~TcpConnection() = default;
  38. virtual void InitConnection(const evutil_socket_t &fd, const struct bufferevent *bev, const TcpServer *server);
  39. void SendMessage(const void *buffer, size_t num) const;
  40. virtual void OnReadHandler(const void *buffer, size_t numBytes);
  41. TcpServer *GetServer() const;
  42. evutil_socket_t GetFd() const;
  43. protected:
  44. TcpMessageHandler tcp_message_handler_;
  45. struct bufferevent *buffer_event_;
  46. evutil_socket_t fd_;
  47. TcpServer *server_;
  48. };
  49. using OnServerReceiveMessage =
  50. std::function<void(const TcpServer &tcp_server, const TcpConnection &conn, const void *buffer, size_t num)>;
  51. class TcpServer {
  52. public:
  53. using OnConnected = std::function<void(const TcpServer *, const TcpConnection *)>;
  54. using OnDisconnected = std::function<void(const TcpServer *, const TcpConnection *)>;
  55. using OnAccepted = std::function<const TcpConnection *(const TcpServer *)>;
  56. explicit TcpServer(std::string address, std::uint16_t port);
  57. virtual ~TcpServer();
  58. void SetServerCallback(const OnConnected &client_conn, const OnDisconnected &client_disconn,
  59. const OnAccepted &client_accept);
  60. void InitServer();
  61. void Start();
  62. void Stop();
  63. void SendToAllClients(const char *data, size_t len);
  64. void AddConnection(const evutil_socket_t &fd, const TcpConnection *connection);
  65. void RemoveConnection(const evutil_socket_t &fd);
  66. void ReceiveMessage(const OnServerReceiveMessage &cb);
  67. static void SendMessage(const TcpConnection &conn, const void *data, size_t num);
  68. void SendMessage(const void *data, size_t num);
  69. OnServerReceiveMessage GetServerReceiveMessage() const;
  70. protected:
  71. static void ListenerCallback(struct evconnlistener *listener, evutil_socket_t socket, struct sockaddr *saddr,
  72. int socklen, void *server);
  73. static void SignalCallback(evutil_socket_t sig, std::int16_t events, void *server);
  74. static void ReadCallback(struct bufferevent *, void *connection);
  75. static void EventCallback(struct bufferevent *, std::int16_t events, void *server);
  76. virtual TcpConnection *onCreateConnection();
  77. private:
  78. struct event_base *base_;
  79. struct event *signal_event_;
  80. struct evconnlistener *listener_;
  81. std::string server_address_;
  82. std::uint16_t server_port_;
  83. std::map<evutil_socket_t, const TcpConnection *> connections_;
  84. OnConnected client_connection_;
  85. OnDisconnected client_disconnection_;
  86. OnAccepted client_accept_;
  87. std::recursive_mutex connection_mutex_;
  88. OnServerReceiveMessage message_callback_;
  89. };
  90. } // namespace comm
  91. } // namespace ps
  92. } // namespace mindspore
  93. #endif // MINDSPORE_CCSRC_PS_COMM_TCP_SERVER_H_