如何解析DNS查询的NS记录段?C语言实现遇解析难题
DNS NS记录解析问题排查
我跟着《DNS Resolver in C》指南用C实现DNS查询,A记录能正常获取,但把查询类型改成2(NS记录)后,无法完整解析响应结果。
相关代码片段
header.qdcount=htons(1); header.ancount=htons(3); //number of NS records I want dns_question_t question; question.dnstype=htons(2);//query type is 2 , that is NS record question.dnsclass = htons(1);//class Internet
响应缓冲区内容
4▒▒.cloudflare.com▒ qns3▒ ▒ qns4▒ ▒ qns5▒ ▒ qns6▒ ▒ qns7▒
当前使用的ANSWER段解析结构
typedef struct { uint16_t compression; uint16_t type; uint16_t class; uint32_t ttl; uint16_t length; char name[]; } __attribute__((packed)) dns_record_ns_t;
域名压缩检查尝试
查阅RFC 1035后怀疑是域名压缩问题,但检查compression字段的前两位时发现并未置位(压缩时该位应置位):
for (int i = 0; i < ntohs (response_header->ancount); i++) { uint16_t x = ntohs(records[i].compression); printf ("%" PRId16 "\n",((x>>1)&1)); printf ("%" PRId16 "\n",((x>>2)&1)); }
编辑补充:压缩处理调整后的问题
学习RFC 1035的DNS域名压缩规则后,调整了解析结构:
typedef struct { uint16_t compression; uint16_t type; uint16_t class; uint32_t ttl; uint16_t length; uint16_t name; } __attribute__((packed)) dns_record_ns_t;
但提取name的二进制位后得到类似“0010000011100000”的结果,将右侧14位转换为偏移量后,数值远大于缓冲区(uint8_t response[512])的大小,请问问题出在哪里?
内容的提问来源于stack exchange,提问作者Shubham Kumar
相关产品推荐
相关产品推荐

