我正在尝试使用libresolv来读取/etc/resolv.conf
文件中的IPv4和IPv6名称服务器:
# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
# 127.0.0.53 is the systemd-resolved stub resolver.
# run "systemd-resolve --status" to see details about the actual nameservers.
nameserver 127.0.0.53
nameserver 2001:4860:4860:0:0:0:0:8888
这是我的C程序:
#include <resolv.h>
#include <stdlib.h>
int main(int argc, char** argv)
{
res_state res = malloc(sizeof(struct __res_state));
res_ninit(res);
printf("IPv4 nscount: %d\n", res->nscount);
printf("IPv6 nscount6: %d\n", res->_u._ext.nscount6);
return 0;
}
产生此输出:
IPv4 nscount: 2
IPv6 nscount6: 0
令我惊讶的是。为什么将IPv6地址计为IPv4地址?
GDB显示第二个地址已清零:
(gdb) display res.nsaddr_list[0]
5: res.nsaddr_list[0] = {sin_family = 2, sin_port = 13568, sin_addr = {s_addr = 889192575}, sin_zero = "\000\000\000\000\000\000\000"}
(gdb) display res.nsaddr_list[1]
6: res.nsaddr_list[1] = {sin_family = 0, sin_port = 0, sin_addr = {s_addr = 0}, sin_zero = "\000\000\000\000\000\000\000"}
任何人都可以帮我理解这种行为吗?
答案 0 :(得分:1)
您真的不应该访问解析器状态的_u._ext
部分,它们是内部实现细节。 nscount6
成员当前未使用且始终为零。必须保持它以避免因结构偏移/尺寸变化而改变ABI。
如果您需要名称服务器列表,则应自行解析/etc/resolv.conf
。请注意,最终,glibc还将支持三个以上的名称服务器,这些额外的解析器不会反映在公共解析器状态中。