#pragma once #include #include #include #include #include #include "IPV4RangeSet.hh" struct ServerState; class DNSServer { public: explicit DNSServer(std::shared_ptr state); DNSServer(const DNSServer&) = delete; DNSServer(DNSServer&&) = delete; DNSServer& operator=(const DNSServer&) = delete; DNSServer& operator=(DNSServer&&) = delete; virtual ~DNSServer() = default; void listen(const std::string& addr, int port); static std::string response_for_query(const void* vdata, size_t size, uint32_t resolved_address); static std::string response_for_query(const std::string& query, uint32_t resolved_address); private: std::shared_ptr state; std::unordered_set> sockets; asio::awaitable dns_server_task(std::shared_ptr sock); };