2017-08-04 126 views
0

我一直在使用linux resolver functions(如res_ninit(),res_nmkquery()等來執行DNS請求。使用res_nmkquery()連接到僅用於ipv6的DNS服務器

現在大多數情況下只需使用系統的默認解析程序即可,但有時我需要手動對特定主機或IP地址執行實時DNS請求。

這就是問題出現的地方 - 我希望能夠連接到只接受IPv6流量的主機上運行的DNS服務器,但是用於連接到特定名稱服務器的代碼通常包含如下內容:

int i, c; 
uint32_t ip; 
struct __res_state state; 
// a bunch of other stuff 
res_ninit(&state); 
// more stuff 
memcpy((void *)&state.nsaddr_list[0].sin_addr, &ip, sizeof(ip)); 
// more stuff with state 
res_nmkquery(&state, /* ... blah blah */); 
// and so on... you get the idea 

此代碼顯然只需IPv4地址(一個uint32_t的值的複製成{__res_state} .ns_addr_list結構,這是一種struct sockaddr_in變量,它也只處理IPv4的值。

在/ USR尋找/include/resolv.h,我可以看到__res_state結構也有變量u_int16_t nscount6;struct sockaddr_in6 *nsaddrs[MAXNS];,這些顯然都支持ipv6。但是,我似乎無法在inter-web上找到關於在res_nmkquery()調用中使用這些值連接到僅用於ipv6的主機上的DNS服務器的任何評論。

那麼,我該如何使用res_nmkquery()和/或struct __res_state連接到ipv6-only主機上的DNS服務器

我已經嘗試直接編輯nsaddrs和nscount6變量,但res_nmkquery()的代碼返回一個錯誤,並且看起來沒有看到我放在那裏的名稱服務器。我需要做些什麼來完成這項工作?

如果它有所作爲,我只關心ubuntu(即僅gcc-only解決方案或gnu-only解決方案是可以接受的)。

回答

0

我真的很討厭回答我的問題,但6個月有沒有這麼多作爲一個單一的評論後,它會出現答案我自己的問題是: 你不能

這樣的函數res_nmkquery()相當過時。從我研究過哪些執行DNS查詢的庫中,他們傾向於(a)加載系統的解析器狀態並手動連接到DNS服務器,或者(b)利用諸如gethostbyname()之類的函數來讓系統執行請求。

這樣的函數res_nmkquery()似乎已經過時並且很少在野外使用。這並不是說他們不好;只有在你嘗試使用它們的時候,可能有更好的方法去做你想要完成的事情。

+0

這東西主要是用於移植舊的* BSD應用程序,並且在Linux上已經過時了;你現在打算使用'getaddrinfo()'和朋友。 –

+0

@MichaelHampton:如果你願意詳細說明一下,把它放在一個答案中,我將選擇它 – cegfault

+1

手冊頁(你鏈接到的)聲明這些函數來自4.3BSD。這個特定的古代BSD於1986年6月發佈,距離第一個IPv6 RFC約有10年的時間。 BSD是[它是](https://en.wikipedia.org/wiki/History_of_the_Berkeley_Software_Distribution),這些功能沒有機會被更新以支持IPv6。因此,我們有新的API ...這可能不值得一個完整的答案.... –