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

标签 c linux dns network-programming

我正在尝试在 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/dh​​cp 中的文件。如果其他东西控制了 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/

相关文章:

c - Haskell 中的 OpenCL 仅处理输入数组的某些元素

c++ - 程序如何映射到计算机的内存和操作?

linux解压不包括文件夹和下面的所有内容

c++ - C++中的分号?

c - 在我的 shell 中实现管道

linux - 从用户空间的程序调用内核模块函数

linux - 使用 Linux::TunTap 读取数据包

dns - 将子域指向另一台主机上的另一个域

c# - IPHostEntry - 需要强制它从另一个域返回 FQDN 主机名

http - DNS 问题