mirror of
https://github.com/oxen-io/lokinet.git
synced 2024-11-17 15:25:35 +00:00
74362149eb
we want to be able to have multiple locally bound dns sockets in lokinet so i restructured most of the dns subsystem in order to make this easier. specifically, we have a new structure to dns subsystem: * dns::QueryJob_Base base type for holding a dns query and response with virtual methods in charge of sending a reply to whoever requested. * dns::PacketSource_Base base type for reading and writing dns messages to and from wherever they came from * dns::Resolver_Base base type for filtering and handling of dns messages asynchronously. * dns::Server contextualized per endpoint dns object, responsible for all dns related isms. this change hides all impelementation details of all of the dns components. adds some more helper functions for parsing dns and dealing with OwnedBuffer. overall dns becomes less of a pain with this new structure. probably.
54 lines
1.8 KiB
C++
54 lines
1.8 KiB
C++
#include "ev.hpp"
|
|
#include "../util/buffer.hpp"
|
|
|
|
namespace llarp
|
|
{
|
|
// Base type for UDP handling; constructed via EventLoop::make_udp().
|
|
struct UDPHandle
|
|
{
|
|
using ReceiveFunc = EventLoop::UDPReceiveFunc;
|
|
|
|
// Starts listening for incoming UDP packets on the given address. Returns true on success,
|
|
// false if the address could not be bound. If you send without calling this first then the
|
|
// socket will bind to a random high port on 0.0.0.0 (the "all addresses" address).
|
|
virtual bool
|
|
listen(const SockAddr& addr) = 0;
|
|
|
|
// Sends a packet to the given recipient, immediately. Returns true if the send succeeded,
|
|
// false it could not be performed (either because of error, or because it would have blocked).
|
|
// If listen hasn't been called then a random IP/port will be used.
|
|
virtual bool
|
|
send(const SockAddr& dest, const llarp_buffer_t& buf) = 0;
|
|
|
|
// Closes the listening UDP socket (if opened); this is typically called (automatically) during
|
|
// destruction. Does nothing if the UDP socket is already closed.
|
|
virtual void
|
|
close() = 0;
|
|
|
|
// Returns the file descriptor of the socket, if available. This generally exists only after
|
|
// listen() has been called, and never exists on Windows.
|
|
virtual std::optional<int>
|
|
file_descriptor()
|
|
{
|
|
return std::nullopt;
|
|
}
|
|
|
|
/// returns the local address we are bound on
|
|
virtual std::optional<SockAddr>
|
|
LocalAddr() const = 0;
|
|
|
|
// Base class destructor
|
|
virtual ~UDPHandle() = default;
|
|
|
|
protected:
|
|
explicit UDPHandle(ReceiveFunc on_recv) : on_recv{std::move(on_recv)}
|
|
{
|
|
// It makes no sense at all to use this with a null receive function:
|
|
assert(this->on_recv);
|
|
}
|
|
|
|
// Callback to invoke when data is received
|
|
ReceiveFunc on_recv;
|
|
};
|
|
} // namespace llarp
|