MSTL 1.4.0
A Modern C++ Library with extended functionality, web components, and utility libraries
载入中...
搜索中...
未找到
dns_client.hpp
1#ifndef MSTL_NETWORK_DNS_CLIENT_HPP__
2#define MSTL_NETWORK_DNS_CLIENT_HPP__
5#include "MSTL/core/container/unordered_map.hpp"
8#include "dns_message.hpp"
9#ifdef MSTL_PLATFORM_LINUX__
10#include <netinet/in.h>
11#else
12#include <ws2def.h>
13#endif
15
16MSTL_ERROR_BUILD_FINAL_CLASS(dns_exception, exception, "DNS Operate Failed");
17
18
19class MSTL_API dns_client {
20private:
21 string dns_server_;
22 uint16_t dns_port_;
23 milliseconds timeout_;
24 bool use_tcp_;
25 unordered_map<string, pair<dns_query_result, steady_clock::time_point>> cache_;
26 seconds cache_ttl_{300};
27 random_mt random_;
28
29private:
30 vector<byte_t> build_dns_query(const string& domain, DNS_RECORD type, DNS_QUERY qclass);
31 static vector<byte_t> encode_domain_name(const string& domain);
32 static string decode_domain_name(const vector<byte_t>& data, size_t& offset);
33
34 vector<byte_t> send_udp_query(const vector<byte_t>& query)const;
35 vector<byte_t> send_tcp_query(const vector<byte_t>& query)const;
36
37 static dns_query_result parse_dns_response(const vector<byte_t>& response);
38 uint16_t generate_query_id() { return random_.next_int(1, 65535); }
39
40 optional<dns_query_result> check_cache(const string& key);
41 void update_cache(const string& key, const dns_query_result& result);
42 static string create_cache_key(const string& domain, DNS_RECORD type, DNS_QUERY qclass);
43
44 static dns_record parse_resource_record(const vector<byte_t>& data, size_t &offset);
45 static string parse_a_record(const vector<byte_t>& rdata);
46 static string parse_aaaa_record(const vector<byte_t>& rdata);
47 static string parse_mx_record(const vector<byte_t>& data, size_t offset, uint16_t rdlength);
48 static string parse_txt_record(const vector<byte_t>& rdata);
49
50public:
51 explicit dns_client(
52 string dns_server = "8.8.8.8",
53 uint16_t dns_port = 53,
55 bool use_tcp = false);
56
57 void set_dns_server(const string& server, uint16_t port = 53);
58
59 void set_timeout(const milliseconds timeout) { timeout_ = timeout; }
60 void set_use_tcp(const bool use_tcp) { use_tcp_ = use_tcp; }
61 void set_cache_ttl(const seconds ttl) { cache_ttl_ = ttl; }
62
63 void clear_cache() { cache_.clear(); }
64
65 dns_query_result query(
66 const string& domain,
67 DNS_RECORD type = DNS_RECORD::A,
68 DNS_QUERY qclass = DNS_QUERY::INTERNET
69 );
70
71 _MSTL future<dns_query_result> query_async(
72 const string& domain,
73 DNS_RECORD type = DNS_RECORD::A,
74 DNS_QUERY qclass = DNS_QUERY::INTERNET
75 );
76
77 vector<string> resolve_a(const string& domain);
78 vector<string> resolve_aaaa(const string& domain);
79 vector<string> resolve_cname(const string& domain);
80 vector<string> resolve_mx(const string& domain);
81 vector<string> resolve_txt(const string& domain);
82 string reverse_query(const string& ip);
83
84 vector<dns_query_result> batch_query(const vector<string>& domains, DNS_RECORD type = DNS_RECORD::A);
85};
86
88#endif // MSTL_NETWORK_DNS_CLIENT_HPP__
int next_int(int max)
生成[0, max)范围内的随机整数
MSTL时钟类型
MSTL异步结果消费者
unsigned short uint16_t
16位无符号整数类型
duration< int64_t, milli > milliseconds
毫秒持续时间
duration< int64_t > seconds
秒持续时间
#define MSTL_ERROR_BUILD_FINAL_CLASS(THIS, BASE, INFO)
构建最终异常类宏
#define _MSTL
全局命名空间MSTL前缀
#define MSTL_END_NAMESPACE__
结束全局命名空间MSTL
#define MSTL_BEGIN_NAMESPACE__
开始全局命名空间MSTL
MSTL_NODISCARD MSTL_ALWAYS_INLINE constexpr decltype(auto) data(Container &cont) noexcept(noexcept(cont.data()))
获取容器的底层数据指针
MSTL可选值类型
MSTL随机数生成器
异常基类