它主要是提取DNS数据包之中查询问题的信息,如:问题类型、问题类别、问题内容(域/IP),我们如果想要对于某个DNS数据包需要进行遥测的时,或者进行NS缓存生命周期管理,那么就需要类似这样的函数实现了。
例子:
uint16_t queries_type = 0;
uint16_t queries_clazz = 0;
ppp::string domain = ppp::net::native::dns::ExtractHostY((Byte*)packet, packet_length,
[&queries_type, &queries_clazz](ppp::net::native::dns::dns_hdr* h, ppp::string& domain, uint16_t type, uint16_t clazz) noexcept -> bool {
queries_type = type;
queries_clazz = clazz;
return true;
});
源声明:
#pragma pack(push, 1)
struct dns_hdr {
uint16_t usTransID; // 标识符
uint16_t usFlags; // 各种标志位
uint16_t usQuestionCount; // Question字段个数
uint16_t usAnswerCount; // Answer字段个数
uint16_t usAuthorityCount; // Authority字段个数
uint16_t usAdditionalCount; // Additional字段个数
};
#pragma pack(pop)
static constexpr int MAX_DOMAINNAME_LEN = 255; /* MAX: 253 +. ≈ 254 BYTE or 254 CHAR+. ≈ 255 BYTE */
static constexpr int DNS_PORT = PPP_DNS_SYS_PORT;
static constexpr int DNS_TYPE_SIZE = 2;
static constexpr int DNS_CLASS_SIZE = 2;
static constexpr int DNS_TTL_SIZE = 4;
static constexpr int DNS_DATALEN_SIZE = 2;
static constexpr int DNS_TYPE_A = 0x0001; //1 a host address
static constexpr int DNS_TYPE_AAAA