Server-Root/TeaDNS/server/src/server.h

54 lines
1.4 KiB
C++

#pragma once
#include <sys/socket.h>
#include <vector>
#include <string>
#include <mutex>
#include <thread>
#include <condition_variable>
#include <event.h>
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<DNSHandler>& handler) : handler{handler} {};
virtual ~WebDNSServer();
bool start(const std::vector<sockaddr_storage>& /* bindings */, std::string& /* error */);
void stop();
const std::vector<std::unique_ptr<Binding>>& bindings() const { return this->_bindings; }
private:
std::shared_ptr<DNSHandler> handler;
std::mutex bind_lock{};
std::vector<std::unique_ptr<Binding>> _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();
};
}