join 1.0
lightweight network framework library
Loading...
Searching...
No Matches
resolver.hpp
Go to the documentation of this file.
1
25#ifndef __JOIN_RESOLVER_HPP__
26#define __JOIN_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, uint16_t port = dnsPort, int timeout = 5000);
175
182 static IpAddressList resolveAllHost (const std::string& host, int family);
183
192 IpAddressList resolveAllHost (const std::string& host, const IpAddress& server, uint16_t port = dnsPort, int timeout = 5000);
193
199 static IpAddressList resolveAllHost (const std::string& host);
200
210 IpAddress resolveHost (const std::string& host, int family, const IpAddress& server, uint16_t port = dnsPort, int timeout = 5000);
211
218 static IpAddress resolveHost (const std::string& host, int family);
219
228 IpAddress resolveHost (const std::string& host, const IpAddress& server, uint16_t port = dnsPort, int timeout = 5000);
229
235 static IpAddress resolveHost (const std::string& host);
236
245 AliasList resolveAllAddress (const IpAddress& address, const IpAddress& server, uint16_t port = dnsPort, int timeout = 5000);
246
253
262 std::string resolveAddress (const IpAddress& address, const IpAddress& server, uint16_t port = dnsPort, int timeout = 5000);
263
269 static std::string resolveAddress (const IpAddress& address);
270
279 ServerList resolveAllNameServer (const std::string& host, const IpAddress& server, uint16_t port = dnsPort, int timeout = 5000);
280
286 static ServerList resolveAllNameServer (const std::string& host);
287
296 std::string resolveNameServer (const std::string& host, const IpAddress& server, uint16_t port = dnsPort, int timeout = 5000);
297
303 static std::string resolveNameServer (const std::string& host);
304
313 std::string resolveAuthority (const std::string& host, const IpAddress& server, uint16_t port = dnsPort, int timeout = 5000);
314
320 static std::string resolveAuthority (const std::string& host);
321
330 ExchangerList resolveAllMailExchanger (const std::string& host, const IpAddress& server, uint16_t port = dnsPort, int timeout = 5000);
331
337 static ExchangerList resolveAllMailExchanger (const std::string& host);
338
347 std::string resolveMailExchanger (const std::string& host, const IpAddress& server, uint16_t port = dnsPort, int timeout = 5000);
348
354 static std::string resolveMailExchanger (const std::string& host);
355
361 static uint16_t resolveService (const std::string& service);
362
368 static std::string typeName (uint16_t recordType);
369
375 static std::string className (uint16_t recordClass);
376
378 static constexpr uint16_t dnsPort = 53;
379
381 using DnsNotify = std::function <void (const DnsPacket&)>;
382
385
388
389 protected:
396 int lookup (DnsPacket& packet, int timeout);
397
408 void setHeader (uint16_t id, uint16_t flags, uint16_t qcount, uint16_t ancount, uint16_t nscount, uint16_t arcount, std::stringstream& data);
409
420 void getHeader (uint16_t& id, uint16_t& flags, uint16_t& qcount, uint16_t& ancount, uint16_t& nscount, uint16_t& arcount, std::stringstream& data);
421
427 static void encodeName (const std::string& host, std::stringstream& data);
428
434 static std::string decodeName (std::stringstream& data);
435
441 static std::string decodeMail (std::stringstream& data);
442
450 static void encodeQuestion (const std::string& host, uint16_t type, uint16_t dnsclass, std::stringstream& data);
451
457 static QuestionRecord decodeQuestion (std::stringstream& data);
458
464 static AnswerRecord decodeAnswer (std::stringstream& data);
465
471 static std::error_code parseError (int error);
472
473 #ifdef DEBUG
474 /*
475 * @brief default callback called when a lookup sequence succeed.
476 * @param packet DNS packet.
477 */
478 static void defaultOnSuccess (const DnsPacket& packet);
479
480 /*
481 * @brief default callback called when a lookup sequence failed.
482 * @param packet DNS packet.
483 */
484 static void defaultOnFailure (const DnsPacket& packet);
485 #endif
486
492 void notify (const DnsNotify& function, const DnsPacket& packet);
493
495 std::string _interface;
496 };
497}
498
499#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:851
static void encodeName(const std::string &host, std::stringstream &data)
encode name.
Definition resolver.cpp:760
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:518
static std::string className(uint16_t recordClass)
get record class name.
Definition resolver.cpp:584
static QuestionRecord decodeQuestion(std::stringstream &data)
decode question record.
Definition resolver.cpp:866
DnsNotify _onFailure
callback called when a lookup sequence failed.
Definition resolver.hpp:387
RecordClass
DNS record classes.
Definition resolver.hpp:113
@ IN
Definition resolver.hpp:114
virtual ~Resolver()=default
destroy instance.
std::function< void(const DnsPacket &)> DnsNotify
notification callback definition.
Definition resolver.hpp:381
std::string resolveAddress(const IpAddress &address, const IpAddress &server, uint16_t port=dnsPort, int timeout=5000)
resolve host address.
Definition resolver.cpp:304
std::string resolveNameServer(const std::string &host, const IpAddress &server, uint16_t port=dnsPort, int timeout=5000)
resolve host name server.
Definition resolver.cpp:386
static AnswerRecord decodeAnswer(std::stringstream &data)
decode answer record.
Definition resolver.cpp:885
static std::string typeName(uint16_t recordType)
get record type name.
Definition resolver.cpp:564
Resolver(const Resolver &other)=delete
copy constructor.
static std::error_code parseError(int error)
convert DNS error to system error code.
Definition resolver.cpp:964
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:735
ServerList resolveAllNameServer(const std::string &host, const IpAddress &server, uint16_t port=dnsPort, int timeout=5000)
resolve all host name server.
Definition resolver.cpp:332
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:710
std::string _interface
interface name.
Definition resolver.hpp:495
static std::string decodeMail(std::stringstream &data)
decode mail.
Definition resolver.cpp:826
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:464
DnsNotify _onSuccess
callback called when a lookup sequence succeed.
Definition resolver.hpp:384
static uint16_t resolveService(const std::string &service)
resolve service name.
Definition resolver.cpp:546
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:414
static std::string decodeName(std::stringstream &data)
decode name.
Definition resolver.cpp:777
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:194
void notify(const DnsNotify &function, const DnsPacket &packet)
safe way to notify DNS events.
Definition resolver.cpp:1087
int lookup(DnsPacket &packet, int timeout)
send the DNS request.
Definition resolver.cpp:598
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:378
AliasList resolveAllAddress(const IpAddress &address, const IpAddress &server, uint16_t port=dnsPort, int timeout=5000)
resolve all host address.
Definition resolver.cpp:250
Definition acceptor.hpp:32
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::set< std::string > ExchangerList
list of mail exchangers.
Definition resolver.hpp:46
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