54 lines
1.4 KiB
C++
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();
|
|
};
|
|
} |