我正在使用getdomainname()和gethostbyname()来尝试获取计算机的域名,以便我可以在我的程序中显示正确的信息。但有时这些功能不会返回正确的信息。
有没有其他方法(在简单的C中)在Linux中获取域名?
编辑:只是为了使它更清楚:我想检查计算机是否属于域。如果是,请获取域名 目前我正在使用上述功能。还有其他人吗?
@unwind:如果我想说谢谢,请不要编辑“简洁”这个问题。我会说谢谢。
谢谢!
答案 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)
要获取正在运行该程序的计算机的主机名: