join 1.0
lightweight network framework library
Loading...
Searching...
No Matches
resolver.hpp
Go to the documentation of this file.
1
25#ifndef JOIN_FABRIC_RESOLVER_HPP
26#define JOIN_FABRIC_RESOLVER_HPP
27
28// libjoin.
29#include <join/endpoint.hpp>
30
31// C++.
32#include <functional>
33#include <string>
34#include <regex>
35#include <set>
36
37namespace join
38{
40 using AliasList = std::set<std::string>;
41
43 using ServerList = std::set<std::string>;
44
46 using ExchangerList = std::set<std::string>;
47
52 {
53 std::string host;
54 uint16_t type = 0;
55 uint16_t dnsclass = 0;
56 };
57
62 {
63 uint32_t ttl = 0;
65 std::string name;
66 std::string mail;
67 uint32_t serial = 0;
68 uint32_t refresh = 0;
69 uint32_t retry = 0;
70 uint32_t expire = 0;
71 uint32_t minimum = 0;
72 uint16_t mxpref = 0;
73 };
74
78 struct DnsPacket
79 {
82 uint16_t port = 0;
83 std::vector<QuestionRecord> questions;
84 std::vector<AnswerRecord> answers;
85 std::vector<AnswerRecord> authorities;
86 std::vector<AnswerRecord> additionals;
87 };
88
93 {
94 public:
98 enum RecordType : uint16_t
99 {
100 A = 1,
101 NS = 2,
102 CNAME = 5,
103 SOA = 6,
104 PTR = 12,
105 MX = 15,
106 AAAA = 28,
107 };
108
112 enum RecordClass : uint16_t
113 {
114 IN = 1,
115 };
116
120 Resolver ();
121
126 Resolver (const std::string& interface);
127
132 Resolver (const Resolver& other) = delete;
133
139 Resolver& operator= (const Resolver& other) = delete;
140
145 Resolver (Resolver&& other) = delete;
146
152 Resolver& operator= (Resolver&& other) = delete;
153
157 virtual ~Resolver () = default;
158
163 static IpAddressList nameServers ();
164
174 IpAddressList resolveAllHost (const std::string& host, int family, const IpAddress& server,
175 uint16_t port = dnsPort, int timeout = 5000);
176
183 static IpAddressList resolveAllHost (const std::string& host, int family);
184
193 IpAddressList resolveAllHost (const std::string& host, const IpAddress& server, uint16_t port = dnsPort,
194 int timeout = 5000);
195
201 static IpAddressList resolveAllHost (const std::string& host);
202
212 IpAddress resolveHost (const std::string& host, int family, const IpAddress& server, uint16_t port = dnsPort,
213 int timeout = 5000);
214
221 static IpAddress resolveHost (const std::string& host, int family);
222
231 IpAddress resolveHost (const std::string& host, const IpAddress& server, uint16_t port = dnsPort,
232 int timeout = 5000);
233
239 static IpAddress resolveHost (const std::string& host);
240
249 AliasList resolveAllAddress (const IpAddress& address, const IpAddress& server, uint16_t port = dnsPort,
250 int timeout = 5000);
251
258
267 std::string resolveAddress (const IpAddress& address, const IpAddress& server, uint16_t port = dnsPort,
268 int timeout = 5000);
269
275 static std::string resolveAddress (const IpAddress& address);
276
285 ServerList resolveAllNameServer (const std::string& host, const IpAddress& server, uint16_t port = dnsPort,
286 int timeout = 5000);
287
293 static ServerList resolveAllNameServer (const std::string& host);
294
303 std::string resolveNameServer (const std::string& host, const IpAddress& server, uint16_t port = dnsPort,
304 int timeout = 5000);
305
311 static std::string resolveNameServer (const std::string& host);
312
321 std::string resolveAuthority (const std::string& host, const IpAddress& server, uint16_t port = dnsPort,
322 int timeout = 5000);
323
329 static std::string resolveAuthority (const std::string& host);
330
339 ExchangerList resolveAllMailExchanger (const std::string& host, const IpAddress& server,
340 uint16_t port = dnsPort, int timeout = 5000);
341
347 static ExchangerList resolveAllMailExchanger (const std::string& host);
348
357 std::string resolveMailExchanger (const std::string& host, const IpAddress& server, uint16_t port = dnsPort,
358 int timeout = 5000);
359
365 static std::string resolveMailExchanger (const std::string& host);
366
372 static uint16_t resolveService (const std::string& service);
373
379 static std::string typeName (uint16_t recordType);
380
386 static std::string className (uint16_t recordClass);
387
389 static constexpr uint16_t dnsPort = 53;
390
392 using DnsNotify = std::function<void (const DnsPacket&)>;
393
396
399
400 protected:
407 int lookup (DnsPacket& packet, int timeout);
408
419 void setHeader (uint16_t id, uint16_t flags, uint16_t qcount, uint16_t ancount, uint16_t nscount,
420 uint16_t arcount, std::stringstream& data);
421
432 void getHeader (uint16_t& id, uint16_t& flags, uint16_t& qcount, uint16_t& ancount, uint16_t& nscount,
433 uint16_t& arcount, std::stringstream& data);
434
440 static void encodeName (const std::string& host, std::stringstream& data);
441
447 static std::string decodeName (std::stringstream& data);
448
454 static std::string decodeMail (std::stringstream& data);
455
463 static void encodeQuestion (const std::string& host, uint16_t type, uint16_t dnsclass, std::stringstream& data);
464
470 static QuestionRecord decodeQuestion (std::stringstream& data);
471
477 static AnswerRecord decodeAnswer (std::stringstream& data);
478
484 static std::error_code parseError (int error);
485
486#ifdef DEBUG
487 /*
488 * @brief default callback called when a lookup sequence succeed.
489 * @param packet DNS packet.
490 */
491 static void defaultOnSuccess (const DnsPacket& packet);
492
493 /*
494 * @brief default callback called when a lookup sequence failed.
495 * @param packet DNS packet.
496 */
497 static void defaultOnFailure (const DnsPacket& packet);
498#endif
499
505 void notify (const DnsNotify& function, const DnsPacket& packet);
506
508 std::string _interface;
509 };
510}
511
512#endif
IPv6, IPv4 address class.
Definition ipaddress.hpp:51
basic domain name resolution class.
Definition resolver.hpp:93
static IpAddressList nameServers()
get IP address of the currently configured name servers.
Definition resolver.cpp:77
static void encodeQuestion(const std::string &host, uint16_t type, uint16_t dnsclass, std::stringstream &data)
decode question record.
Definition resolver.cpp:858
static void encodeName(const std::string &host, std::stringstream &data)
encode name.
Definition resolver.cpp:767
Resolver()
default constructor.
Definition resolver.cpp:53
std::string resolveMailExchanger(const std::string &host, const IpAddress &server, uint16_t port=dnsPort, int timeout=5000)
resolve host mail exchanger.
Definition resolver.cpp:521
static std::string className(uint16_t recordClass)
get record class name.
Definition resolver.cpp:588
static QuestionRecord decodeQuestion(std::stringstream &data)
decode question record.
Definition resolver.cpp:873
DnsNotify _onFailure
callback called when a lookup sequence failed.
Definition resolver.hpp:398
RecordClass
DNS record classes.
Definition resolver.hpp:113
@ IN
Definition resolver.hpp:114
virtual ~Resolver()=default
destroy instance.
std::string resolveAddress(const IpAddress &address, const IpAddress &server, uint16_t port=dnsPort, int timeout=5000)
resolve host address.
Definition resolver.cpp:306
std::string resolveNameServer(const std::string &host, const IpAddress &server, uint16_t port=dnsPort, int timeout=5000)
resolve host name server.
Definition resolver.cpp:388
static AnswerRecord decodeAnswer(std::stringstream &data)
decode answer record.
Definition resolver.cpp:892
static std::string typeName(uint16_t recordType)
get record type name.
Definition resolver.cpp:568
Resolver(const Resolver &other)=delete
copy constructor.
static std::error_code parseError(int error)
convert DNS error to system error code.
Definition resolver.cpp:971
void getHeader(uint16_t &id, uint16_t &flags, uint16_t &qcount, uint16_t &ancount, uint16_t &nscount, uint16_t &arcount, std::stringstream &data)
get DNS header.
Definition resolver.cpp:741
ServerList resolveAllNameServer(const std::string &host, const IpAddress &server, uint16_t port=dnsPort, int timeout=5000)
resolve all host name server.
Definition resolver.cpp:334
void setHeader(uint16_t id, uint16_t flags, uint16_t qcount, uint16_t ancount, uint16_t nscount, uint16_t arcount, std::stringstream &data)
set DNS header.
Definition resolver.cpp:715
std::string _interface
interface name.
Definition resolver.hpp:508
static std::string decodeMail(std::stringstream &data)
decode mail.
Definition resolver.cpp:833
RecordType
DNS record types.
Definition resolver.hpp:99
@ CNAME
Definition resolver.hpp:102
@ NS
Definition resolver.hpp:101
@ SOA
Definition resolver.hpp:103
@ MX
Definition resolver.hpp:105
@ AAAA
Definition resolver.hpp:106
@ A
Definition resolver.hpp:100
@ PTR
Definition resolver.hpp:104
Resolver(Resolver &&other)=delete
move constructor.
Resolver & operator=(const Resolver &other)=delete
copy assignment operator.
ExchangerList resolveAllMailExchanger(const std::string &host, const IpAddress &server, uint16_t port=dnsPort, int timeout=5000)
resolve all host mail exchanger.
Definition resolver.cpp:466
DnsNotify _onSuccess
callback called when a lookup sequence succeed.
Definition resolver.hpp:395
static uint16_t resolveService(const std::string &service)
resolve service name.
Definition resolver.cpp:550
std::string resolveAuthority(const std::string &host, const IpAddress &server, uint16_t port=dnsPort, int timeout=5000)
resolve host start of authority name server.
Definition resolver.cpp:416
std::function< void(const DnsPacket &)> DnsNotify
notification callback definition.
Definition resolver.hpp:392
static std::string decodeName(std::stringstream &data)
decode name.
Definition resolver.cpp:784
IpAddress resolveHost(const std::string &host, int family, const IpAddress &server, uint16_t port=dnsPort, int timeout=5000)
resolve host name using address family.
Definition resolver.cpp:195
void notify(const DnsNotify &function, const DnsPacket &packet)
safe way to notify DNS events.
Definition resolver.cpp:1094
int lookup(DnsPacket &packet, int timeout)
send the DNS request.
Definition resolver.cpp:602
IpAddressList resolveAllHost(const std::string &host, int family, const IpAddress &server, uint16_t port=dnsPort, int timeout=5000)
resolve host name and return all IP address found.
Definition resolver.cpp:105
static constexpr uint16_t dnsPort
default DNS port.
Definition resolver.hpp:389
AliasList resolveAllAddress(const IpAddress &address, const IpAddress &server, uint16_t port=dnsPort, int timeout=5000)
resolve all host address.
Definition resolver.cpp:252
Definition acceptor.hpp:32
std::set< std::string > ExchangerList
list of mail exchangers.
Definition resolver.hpp:46
std::set< std::string > AliasList
list of alias.
Definition resolver.hpp:40
std::set< std::string > ServerList
list of name servers.
Definition resolver.hpp:43
std::vector< IpAddress > IpAddressList
List of IP address.
Definition ipaddress.hpp:45
answer record.
Definition resolver.hpp:62
uint16_t mxpref
Definition resolver.hpp:72
std::string mail
Definition resolver.hpp:66
uint32_t expire
Definition resolver.hpp:70
IpAddress addr
Definition resolver.hpp:64
uint32_t retry
Definition resolver.hpp:69
uint32_t serial
Definition resolver.hpp:67
uint32_t ttl
Definition resolver.hpp:63
uint32_t refresh
Definition resolver.hpp:68
std::string name
Definition resolver.hpp:65
uint32_t minimum
Definition resolver.hpp:71
DNS packet.
Definition resolver.hpp:79
uint16_t port
Definition resolver.hpp:82
std::vector< AnswerRecord > additionals
Definition resolver.hpp:86
std::vector< AnswerRecord > authorities
Definition resolver.hpp:85
std::vector< AnswerRecord > answers
Definition resolver.hpp:84
std::vector< QuestionRecord > questions
Definition resolver.hpp:83
IpAddress src
Definition resolver.hpp:80
IpAddress dest
Definition resolver.hpp:81
question record.
Definition resolver.hpp:52
std::string host
Definition resolver.hpp:53
uint16_t type
Definition resolver.hpp:54
uint16_t dnsclass
Definition resolver.hpp:55
IpAddress address
Definition tcpacceptor_test.cpp:35
uint16_t port
Definition tcpacceptor_test.cpp:36