2017-08-04 36 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 ...这可能不值得一个完整的答案.... –