uvco 0.1
Loading...
Searching...
No Matches
name_resolution.h
Go to the documentation of this file.
1// uvco (c) 2023 Lewin Bormann. See LICENSE for specific terms.
2
3#pragma once
4
5#include <uv.h>
6
9#include "uvco/run.h"
10
11#include <cstdint>
12#include <span>
13#include <string>
14#include <string_view>
15#include <variant>
16
17namespace uvco {
18
24
33 struct NtopHelper_;
34
35public:
36 constexpr static size_t ipv4Length = 4;
37 constexpr static size_t ipv6Length = 16;
38
39 AddressHandle() = default;
40 AddressHandle(const AddressHandle &) = default;
44 ~AddressHandle() = default;
45
46 AddressHandle(std::span<const uint8_t> ipv4_or_6, uint16_t port,
47 uint32_t v6scope = 0);
48 AddressHandle(uint32_t ipv4, uint16_t port);
49 AddressHandle(std::string_view ip, uint16_t port, uint32_t v6scope = 0);
50 explicit AddressHandle(const struct addrinfo *ai);
51 explicit AddressHandle(const struct sockaddr *sa);
52
53 // The address, formatted by `inet_ntop(3)`.
54 [[nodiscard]] std::string address() const {
55 return std::visit(NtopHelper_{}, addr_);
56 }
57 [[nodiscard]] uint16_t port() const;
59 int family() const;
62 [[nodiscard]] const struct sockaddr *sockaddr() const;
63
64 [[nodiscard]] std::string toString() const;
65
66private:
67 std::variant<struct sockaddr_in, struct sockaddr_in6> addr_;
68
70 struct NtopHelper_ {
71 static std::string operator()(const struct sockaddr_in &ipv4);
72 static std::string operator()(const struct sockaddr_in6 &ipv6);
73 static std::string ntop(int family, void *addr);
74 };
75};
76
78class Resolver {
79public:
81 explicit Resolver(const Loop &loop) : loop_{&loop} {}
82
84 Promise<AddressHandle> gai(std::string_view host, std::string_view port,
85 int af_hint = AF_UNSPEC);
88 Promise<AddressHandle> gai(std::string_view host, uint16_t port,
89 int af_hint = AF_UNSPEC);
90
91private:
92 const Loop *loop_;
93
95 static void onAddrinfo(uv_getaddrinfo_t *req, uv_status status,
96 struct addrinfo *result);
97};
98
100
101} // namespace uvco
static constexpr size_t ipv4Length
Definition name_resolution.h:36
std::string address() const
Definition name_resolution.h:54
std::variant< struct sockaddr_in, struct sockaddr_in6 > addr_
Definition name_resolution.h:67
AddressHandle(AddressHandle &&)=default
int family() const
Family is either AF_INET or AF_INET6.
Definition name_resolution.cc:76
const struct sockaddr * sockaddr() const
Definition name_resolution.cc:83
AddressHandle(const AddressHandle &)=default
std::string toString() const
Definition name_resolution.cc:58
uint16_t port() const
Definition name_resolution.cc:67
AddressHandle & operator=(AddressHandle &&)=default
static constexpr size_t ipv6Length
Definition name_resolution.h:37
~AddressHandle()=default
AddressHandle()=default
AddressHandle & operator=(const AddressHandle &)=default
Definition loop.h:26
Definition promise.h:49
Resolver(const Loop &loop)
Instantiate a resolver based on an event loop.
Definition name_resolution.h:81
const Loop * loop_
Definition name_resolution.h:92
Promise< AddressHandle > gai(std::string_view host, std::string_view port, int af_hint=AF_UNSPEC)
Resolve a host and port string. Throws an UvcoException upon error.
Definition name_resolution.cc:227
static void onAddrinfo(uv_getaddrinfo_t *req, uv_status status, struct addrinfo *result)
Called after finishing a getaddrinfo call.
Definition name_resolution.cc:247
int uv_status
Result of a libuv operation, an errno error code.
Definition internal_utils.h:22
Definition async_work.cc:18
A helper for calling inet_ntop(3).
Definition name_resolution.h:70
static std::string operator()(const struct sockaddr_in &ipv4)
Definition name_resolution.cc:168
static std::string ntop(int family, void *addr)
Definition name_resolution.cc:147