c - 使用 res_nmkquery() 连接到仅限 ipv6 的 DNS 服务器

标签 c dns ipv6

我一直在使用 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/

相关文章:

c - C 中的多维 (2D) 数组

java - TopCoder 最佳选择算法来自 SRM 489 DIV 2(500 分)

java - 在 Java 中检查有效的 IPv4 地址

linux - Docker守护程序套接字配置

c - vfprintf() 抛出 SegFault - 但输入定义明确?

c++ - 构建用于发布的卷影服务应用程序

amazon-web-services - 如何确保我的 http ://ec2-**-**-***. ap-south-1.compute.amazonaws.com 指向我的域?

wcf - 为单独的服务器设置 SSL/证书

linux - DNS 服务器 Oracle Linux、VirtualBox

jetty - 将 Jetty 绑定(bind)到 IPv6 地址