1

我正在使用 libresolv 执行对 dns 服务器的请求。

我也使用本地 dns 缓存。(dnsmasq/未绑定)

dig例如,当我使用时dig google.com,请求被缓存,下一个请求使用缓存值。

我们可以在 dnsmasq 日志中看到这一点:

Nov  9 10:46:46 y dnsmasq[24003]: query[A] google.com from 127.0.0.1
Nov  9 10:46:46 y dnsmasq[24003]: forwarded google.com to **.**.**.**
Nov  9 10:46:46 y dnsmasq[24003]: reply google.com is 173.194.32.165
Nov  9 10:46:46 y dnsmasq[24003]: reply google.com is 173.194.32.160
Nov  9 10:46:49 y dnsmasq[24003]: query[A] google.com from 127.0.0.1
Nov  9 10:46:49 y dnsmasq[24003]: cached google.com is 173.194.32.165
Nov  9 10:46:49 y dnsmasq[24003]: cached google.com is 173.194.32.168

然后我使用res_query ,我得到了这个:

Nov  9 10:50:29 y dnsmasq[24003]: query[MX] google.com from 127.0.0.1
Nov  9 10:50:29 y dnsmasq[24003]: forwarded google.com to **.**.**.**
Nov  9 10:50:29 y dnsmasq[24003]: forwarded google.com to **.**.**.**
Nov  9 10:51:13 y dnsmasq[24003]: query[MX] google.com from 127.0.0.1
Nov  9 10:51:13 y dnsmasq[24003]: forwarded google.com to **.**.**.**
Nov  9 10:51:13 y dnsmasq[24003]: forwarded google.com to **.**.**.**

所以看起来来自 dns 服务器的响应没有命中 dns 缓存并且没有被缓存。

有没有办法缓存来自的请求res_query

这就是我向 DNS 解析器发出请求的方式:

 struct __res_state dnsstate;
 int rc = res_ninit(&dnsstate);
 if (rc < 0) {
     return result;
 }
 dnsstate.retrans = timeout;

 int len = res_nquery(&dnsstate, domain.c_str(), ns_c_in, ns_t_mx, nsbuf, sizeof(nsbuf));

我想 res_nquery 不会检查本地 DNS 缓存,而 dig 会。

4

1 回答 1

1

两者都挖掘并将res_nquery()查询发送到您/etc/resolv.conf文件中的任何内容,即您的 dnsmasq 实例。默认情况下,两者还将设置该RD位以请求递归。

然后,dnsmasq 将从缓存中提供答案,或者如果 TTL 已过期,则去获取它们。但是据我所知res_nquery,客户端可以设置的 DNS 协议本身(因此设置中也没有任何内容)会影响该行为

于 2016-11-15T08:36:01.153 回答