我一直在使用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解决方案是可以接受的)。
这东西主要是用于移植旧的* BSD应用程序,并且在Linux上已经过时了;你现在打算使用'getaddrinfo()'和朋友。 –
@MichaelHampton:如果你愿意详细说明一下,把它放在一个答案中,我将选择它 – cegfault
手册页(你链接到的)声明这些函数来自4.3BSD。这个特定的古代BSD于1986年6月发布,距离第一个IPv6 RFC约有10年的时间。 BSD是[它是](https://en.wikipedia.org/wiki/History_of_the_Berkeley_Software_Distribution),这些功能没有机会被更新以支持IPv6。因此,我们有新的API ...这可能不值得一个完整的答案.... –