1
我正在使用libresolv来执行对DNS服务器的请求。如何使res_query工作与DNS缓存?
另外我使用本地dns缓存。 (dnsmasq/unbound)
当我使用时,例如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缓存,并挖呢。
@Alnitak是啊所以我应该问管理员关于libresolv的工作方式? Stackoverflow变得非常荒谬的地方提问。 – Yaroslav
我可能误读了这个问题(很难说现在,我有9个小时的时差,只有3个小时的睡眠),但根据书面记载,我无法确切地告诉你在问什么。试着看一下tcpdump,看看libresolv发送的内容与dig发送的内容之间的区别(如果有的话)。也许还会显示一些代码来显示您正在使用libresolv的_how_。 – Alnitak
@Alnitak我已经在我的问题中提出了一些代码。 Tnx的建议与tcpdump。我已经试过了。看起来像res_nquery仍然发送数据包来检查DNS,而挖掘什么都不发送,只是检查DNS缓存。 似乎res_nquery只能用dns的strait请求 – Yaroslav