在Linux C中检索DHCP分配的域后缀

Ben*_*ale 7 c linux dns network-programming

我试图在ANSI C(Linux)中以编程方式检索我的主机的本地域后缀.例如:我的机器是ironside.0ffnet.net,我想检索"0ffnet.net".

我已经看过许多帖子通过使用getnameinfo()和getaddrinfo()来解决这个问题,但是看起来这些函数从/ etc/hosts文件中提取了它们对于机器本地的任何接口地址的信息.

如果我的机器通过DHCP分配了一个地址(和相应的域后缀),则/ etc/hosts文件不会更新,而是将此信息存储在/etc/resolv.conf中,例如:

dfex@ironside:~/hush$cat /etc/resolv.conf 
domain 0ffnet.net
search 0ffnet.net
nameserver 139.130.4.4
Run Code Online (Sandbox Code Playgroud)

因此,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
Run Code Online (Sandbox Code Playgroud)

有没有人知道一个函数会在不诉诸system()调用的情况下获取这些信息?我一直在梳理Beej的指南而没有太大的成功.

Ala*_*rry 2

我将不得不分解这个问题并分别回答各个部分。首先是标题问题。

DHCP 域

真正了解 DHCP 客户端从 DHCP 服务器接收到的内容的唯一方法是读取客户端留下的文件/var/lib/dhcp。如果其他东西已控制 .DHCP 建议的搜索域,则可能根本不会使用resolv.conf

“我的主机的本地域后缀”

主机可能属于多个域,也可能不属于任何一个域,这使得这个概念很难定义。resolv.conf指定将搜索您正在解析的主机名的域;当应用于您自己的主机名时,并不能从根本上保证搜索会成功。

任何!解析器搜索列表是我真正想要的。我怎样才能得到它?

打电话res_init,然后查看_res.dnsrch和/或_res.defdname。或者解析resolv.conf你自己;这是一种非常简单且稳定的格式。

那么 getdomainname() 是做什么用的呢?

这是用于 NIS(YP) 的,您可能不想要它。