#pragma once #include #include #include #include #include #include #include namespace ts::dns { class DNSHandler; class WebDNSServer { public: struct Binding { WebDNSServer* server{nullptr}; sockaddr_storage address{}; int socket{0}; std::string error{}; inline bool active() const { return this->socket != 0; } event* read_event{nullptr}; event* write_event{nullptr}; }; WebDNSServer(const std::shared_ptr& handler) : handler{handler} {}; virtual ~WebDNSServer(); bool start(const std::vector& /* bindings */, std::string& /* error */); void stop(); const std::vector>& bindings() const { return this->_bindings; } private: std::shared_ptr handler; std::mutex bind_lock{}; std::vector> _bindings; bool started{false}; std::thread event_base_executor{}; struct event* event_base_ticker{nullptr}; struct event_base* event_base{nullptr}; bool bind(Binding& /* binding */, std::string& /* error */); void unbind(Binding& /* binding */); void event_cb_timer(); static void event_cb_read(evutil_socket_t fd, short, void *binding); static void event_cb_write(evutil_socket_t fd, short, void *binding); void event_executor(); }; }