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