在Linux中通过代码获取域名

时间:2010-08-27 13:06:36

标签: c linux

我正在使用getdomainname()和gethostbyname()来尝试获取计算机的域名,以便我可以在我的程序中显示正确的信息。但有时这些功能不会返回正确的信息。

有没有其他方法(在简单的C中)在Linux中获取域名?

编辑:只是为了使它更清楚:我想检查计算机是否属于域。如果是,请获取域名 目前我正在使用上述功能。还有其他人吗?

@unwind:如果我想说谢谢,请不要编辑“简洁”这个问题。我会说谢谢。

谢谢!

3 个答案:

答案 0 :(得分:1)

如果您想获取(Internet)域名,则需要考虑某些问题。

计算机可以有多个网络接口,实际上它几乎肯定至少有两个包括环回接口。每个接口都有一个IP地址(可能不止一个),每个IP地址都可以映射到hosts文件中任意数量的DNS名称和条目。

因此,如果getdomainname()返回的许多可能的域名中的任何一个取决于一大堆配置问题。例如哪个IP地址配置为主要地址,是否优先使用hosts文件,是否正确配置了hosts文件,IP地址是否具有反向查找集以及许多其他问题。

例如,错误配置hosts文件是很常见的。如果您在其中看到如下条目:

192.168.1.1  foohost foohost.example.com

这是错误的。一行中的第一个主机名是规范名称(对于接口),后续条目只是别名。如果您希望域名作为example.com而不是什么,那么它需要看起来像这样:

192.168.1.1  foohost.example.com foohost

此外,互联网上的每个IP地址理想情况下都应在DNS中具有反向查找记录,该记录将IP地址映射到主机名和域。但是,没有规则可以说 存在,或者说它必须是您在其中SSH或指向您的Web浏览器的域。

在任何给定的计算机上,有许多原因导致域名不符合您的期望。

答案 1 :(得分:0)

不幸的是,这些信息并不总是正确设置。首先,向系统管理员投诉。

如果所有失败,如下所示,您可能会得到一个带有规范主机名的字段res->ai_canonname,然后迭代所有IP地址:

struct addrinfo *res = NULL;
struct addrinfo hints = {
   .ai_family = AF_UNSPEC,
   .ai_flags = AI_V4MAPPED | AI_ADDRCONFIG | AI_CANONNAME | (name ? 0 : AI_PASSIVE),
    .ai_socktype = SOCK_STREAM,
};
getaddrinfo(name, NULL, &hints, &res);
for (struct addrinfo *p = res; p; p = p->ai_next) {
 ...
}

然后你必须以某种方式选择哪些对你有意义(避免环回等)并尝试找到对应于这些IP地址之一的主机名。但由于IP地址不一定与有效的主机名相对应,因此也可能失败。

答案 2 :(得分:-2)

要获取正在运行该程序的计算机的主机名:

  • uname
  • 的/ etc /主机名