C++ 如何使res_查询与dns缓存一起工作?

C++ 如何使res_查询与dns缓存一起工作?,c++,c,caching,dns,libresolv,C++,C,Caching,Dns,Libresolv,我正在使用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 **.**

我正在使用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\u 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\u 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));
struct\u res\u state dnssstate;
int rc=res_ninit(&dnsstate);
if(rc<0){
返回结果;
}
dnsstate.retrans=超时;
int len=res_nquery(&dnsstate,domain.c_str(),ns_c_in,ns_t_mx,nsbuf,sizeof(nsbuf));

我假设res\u-nquery不检查本地DNS缓存,而dig检查。

dig和
res\u-nquery()
都会将查询发送到
/etc/resolv.conf
文件中的任何内容,即dnsmasq实例。默认情况下,两者都将
RD
位设置为请求递归


然后,dnsmasq将从缓存中提供答案,或者在TTL已过期的情况下获取答案。然而据我所知,DNS协议本身(因此,
res\n query
设置)中没有任何客户端可以设置的会影响该行为的内容

@Alnitak是的,因此我应该询问管理员libresolv是如何工作的?Stackoverflow成为了一个非常可笑的提问场所。我可能误解了这个问题(现在很难说,我有9个小时的时差,只睡了3个小时),但正如我所写的,我真的不知道你在问什么。尝试查看tcpdump,以查看libresolv发送的内容与dig发送的内容之间的差异(如果有)。也许还可以显示一些代码来显示如何使用libresolv。@Alnitak我在问题中添加了一些代码。Tnx向tcpdump寻求建议。我已经试过了。看起来resu_\nquery仍然发送数据包来检查dns,而dig什么也不发送,只是检查dns缓存。似乎res_\n query只能处理对dnsBoth的streat请求,
dig
resu\n query
只会将查询发送到
resolv.conf
中的任何对象,即您的dnsmasq实例,并且默认情况下,这两个实例都会将
+RD
位设置为请求递归。然后,dnsmasq将从缓存中提供答案,或者在TTL已过期的情况下获取答案,但据我所知,DNS协议本身没有任何内容(因此,
resu\nquery
设置中没有任何内容可供客户端设置,从而影响该行为。p.s。还可以尝试发送相同的查询-您的
dig
示例请求A记录,但您的
resu\nquery
请求MX记录-可能dnsmasq本身根据查询RTYPE的行为不同?