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>
19class MSTL_API dns_client {
25 unordered_map<string, pair<dns_query_result, steady_clock::time_point>> cache_;
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);
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;
37 static dns_query_result parse_dns_response(
const vector<byte_t>& response);
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);
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);
52 string dns_server =
"8.8.8.8",
55 bool use_tcp =
false);
57 void set_dns_server(
const string& server,
uint16_t port = 53);
60 void set_use_tcp(
const bool use_tcp) { use_tcp_ = use_tcp; }
61 void set_cache_ttl(
const seconds ttl) { cache_ttl_ = ttl; }
63 void clear_cache() { cache_.clear(); }
65 dns_query_result query(
67 DNS_RECORD type = DNS_RECORD::A,
68 DNS_QUERY qclass = DNS_QUERY::INTERNET
71 _MSTL future<dns_query_result> query_async(
73 DNS_RECORD type = DNS_RECORD::A,
74 DNS_QUERY qclass = DNS_QUERY::INTERNET
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);
84 vector<dns_query_result> batch_query(
const vector<string>& domains, DNS_RECORD type = DNS_RECORD::A);
int next_int(int max)
生成[0, max)范围内的随机整数
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()))
获取容器的底层数据指针