使用 res_nmkquery() 连接到仅支持 ipv6 的 DNS 服务器

Use res_nmkquery() to connect to an ipv6-only DNS server

我一直在使用linux resolver functions,例如res_ninit()、res_nmkquery()等,来执行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。但是,我似乎无法在互联网上找到任何关于在 res_nmkquery() 调用中使用这些值以连接到仅 ipv6 主机上的 DNS 服务器的评论。

那么,我如何使用 res_nmkquery() and/or 结构 __res_state 连接到仅 ipv6 主机上的 DNS 服务器?

我已经尝试直接编辑 nsaddrs 和 nscount6 变量,但是 res_nmkquery() returns 的代码出现错误,并且似乎看不到我放在那里的名称服务器。我需要做什么才能完成这项工作?

如果有区别,我只关心ubuntu(即,gcc-only 解决方案或gnu-only 解决方案都可以接受)。

我真的很讨厌回答我自己的问题,但在 6 个月后 连一条评论都没有,看来我自己的问题的答案是: 你不能.

res_nmkquery()这样的函数已经过时了。从我研究过的执行 DNS 查询的库中,它们倾向于 (a) 加载系统的解析器状态并手动连接到 DNS 服务器,或者 (b) 使用 gethostbyname()[=21 之类的函数=]让系统执行请求。

res_nmkquery()这样的函数似乎已经过时了,很少在野外使用。这并不是说它们不好。只是如果您尝试使用它们,可能有更好的方法来完成您想要完成的任务。