我一直在使用 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() 和/或 struct __res_state 连接到仅 ipv6 主机上的 DNS 服务器?
我已经尝试直接编辑 nsaddrs 和 nscount6 变量,但是 res_nmkquery() 的代码返回错误,并且似乎看不到我放在那里的名称服务器。我需要做什么才能使这项工作成功?
如果有区别,我只关心 ubuntu(即,仅 gcc 解决方案或仅 gnu 解决方案是可以接受的)。
最佳答案
我真的很讨厌回答我自己的问题,但是在六个月之后,没有任何评论,我自己的问题的答案似乎是: 你不能。
像 res_nmkquery() 这样的函数已经相当过时了。从我研究过的执行 DNS 查询的库来看,它们倾向于 (a) 加载系统的解析器状态并手动连接到 DNS 服务器,或者 (b) 利用诸如 gethostbyname() 之类的函数来让系统执行请求。
像 res_nmkquery() 这样的函数似乎已经过时并且很少在野外使用。这并不是说它们不好;而是说它们不好。只是如果您尝试使用它们,可能有更好的方法来完成您想要完成的任务。
关于c - 使用 res_nmkquery() 连接到仅限 ipv6 的 DNS 服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45496704/