我正在尝试在 ANSI C (Linux) 中以编程方式检索主机的本地域后缀。例如:我的机器是 ironside.0ffnet.net,我想检索“0ffnet.net”。
我已经看到许多帖子通过使用 getnameinfo() 和 getaddrinfo() 来解决这个问题,但是这些函数似乎从/etc/hosts 文件中提取机器本地接口(interface)地址的信息。
如果我的机器通过 DHCP 分配了一个地址(和相应的域后缀),/etc/hosts 文件不会更新,而是将此信息存储在/etc/resolv.conf 中,例如:
dfex@ironside:~/hush$cat /etc/resolv.conf
domain 0ffnet.net
search 0ffnet.net
nameserver 139.130.4.4
因此,getnameinfo() 和 getaddrinfo() 都简单地返回机器的主机名,没有后缀,使用/etc/hosts 信息,看起来像:
dfex@ironside:~/hush$ cat /etc/hosts
::1 ironside localhost6.localdomain6 localhost6
127.0.1.1 ironside
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
有没有人知道一个函数可以在不求助于 system() 调用的情况下提取这些信息?我一直在梳理 Beej 的指南,但没有取得太大成功。
最佳答案
我将不得不把这个问题分解开来,分别回答各个部分。首先是标题问题。
DHCP域
真正了解 DHCP 客户端从 DHCP 服务器接收到什么的唯一方法是读取客户端留在 /var/lib/dhcp
中的文件。如果其他东西控制了 resolv.conf
,则 DHCP 建议的搜索域可能根本不会被使用。
“我的主机的本地域名后缀”
主机可能属于多个域,也可能不属于任何域,这使得这是一个很难定义的概念。 resolv.conf
指定将搜索您正在解析的主机名的域;当应用于您的自己的主机名时,并不能从根本上保证搜索会成功。
随便!解析器搜索列表是我真正想要的。我如何获得它?
调用 res_init
然后查看 _res.dnsrch
和/或 _res.defdname
。或者自己解析resolv.conf
;这是一种非常简单和稳定的格式。
那么 getdomainname() 是做什么用的呢?
它适用于 NIS(YP),您可能不想要它。
关于c - 在 Linux C 中检索 DHCP 分配的域后缀,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12227438/