You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解析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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 19:20:06