diff options
Diffstat (limited to 'src/osd/modules/ipc/tcp_server.h')
-rw-r--r-- | src/osd/modules/ipc/tcp_server.h | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/src/osd/modules/ipc/tcp_server.h b/src/osd/modules/ipc/tcp_server.h new file mode 100644 index 00000000000..3a4c75de2d7 --- /dev/null +++ b/src/osd/modules/ipc/tcp_server.h @@ -0,0 +1,72 @@ +// license:BSD-3-Clause +// copyright-holders:Inaki Baz Castillo,Miodrag Milanovic + +#ifndef TCP_SERVER_H +#define TCP_SERVER_H + +#include "tcp_connection.h" +#include <string> +#include <unordered_set> +#include <uv.h> + +class tcp_server : public tcp_connection::listener +{ +public: + tcp_server(uv_loop_t* m_loop, const std::string &ip, uint16_t port, int backlog); + virtual ~tcp_server(); + + void close(); + void terminate(); + virtual void dump(); + void send_to_all(const uint8_t* data, size_t len); + bool is_closing(); + const struct sockaddr* get_local_address(); + const std::string& get_local_ip(); + uint16_t get_local_port(); + size_t get_num_connections(); + +private: + bool set_local_address(); + + /* Pure virtual methods that must be implemented by the subclass. */ +protected: + virtual void user_on_tcp_connection_alloc(tcp_connection** connection) = 0; + virtual void user_on_new_tcp_connection(tcp_connection* connection) = 0; + virtual void user_on_tcp_connection_closed(tcp_connection* connection, bool is_closed_by_peer) = 0; + virtual void user_on_tcp_server_closed() = 0; + + /* Callbacks fired by UV events. */ +public: + void on_uv_connection(int status); + void on_uv_closed(); + + /* Methods inherited from tcp_connection::listener. */ + virtual void on_tcp_connection_closed(tcp_connection* connection, bool is_closed_by_peer) override; + +private: + // Allocated by this (may be passed by argument). + uv_tcp_t* m_uv_handle; + uv_loop_t* m_loop; + // Others. + std::unordered_set<tcp_connection*> m_connections; + bool m_is_closing; + +protected: + struct sockaddr_storage m_local_addr; + std::string m_local_ip; + uint16_t m_local_port; +}; + +/* Inline methods. */ + +inline bool tcp_server::is_closing() +{ + return m_is_closing; +} + +inline size_t tcp_server::get_num_connections() +{ + return m_connections.size(); +} + +#endif |