在C项目(POSIX)中,如何获取当前系统的完全限定名称?
例如,我可以通过这样做获得我的机器的主机名
来自unistd.h的gethostname()
。这可能会给我machine3
作为回报,但我实际上是在寻找machine3.somedomain.com
。
如何获取此信息?如果可能的话,我不想使用system()来执行此操作。
答案 0 :(得分:49)
要获取计算机的完全限定名称,我们必须首先获取本地主机名,然后查找规范名称。
最简单的方法是首先使用uname()
或gethostname()
获取本地主机名,然后使用gethostbyname()
执行查找并查看h_name
成员它返回的结构。如果您使用的是ANSI c,则必须使用uname()
而不是gethostname()
。
示例:
char hostname[1024];
hostname[1023] = '\0';
gethostname(hostname, 1023);
printf("Hostname: %s\n", hostname);
struct hostent* h;
h = gethostbyname(hostname);
printf("h_name: %s\n", h->h_name);
不幸的是,gethostbyname()
在当前的POSIX规范中已被弃用,因为它在IPv6方面表现不佳。此代码的更现代版本将使用getaddrinfo()
。
示例:
struct addrinfo hints, *info, *p;
int gai_result;
char hostname[1024];
hostname[1023] = '\0';
gethostname(hostname, 1023);
memset(&hints, 0, sizeof hints);
hints.ai_family = AF_UNSPEC; /*either IPV4 or IPV6*/
hints.ai_socktype = SOCK_STREAM;
hints.ai_flags = AI_CANONNAME;
if ((gai_result = getaddrinfo(hostname, "http", &hints, &info)) != 0) {
fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(gai_result));
exit(1);
}
for(p = info; p != NULL; p = p->ai_next) {
printf("hostname: %s\n", p->ai_canonname);
}
freeaddrinfo(info);
当然,这只有在机器有FQDN时才有效 - 如果没有,getaddrinfo()
的结果最终与非限定主机名相同。
答案 1 :(得分:8)
我的解决方案:
#ifdef WIN32
#include <Windows.h>
#include <tchar.h>
#else
#include <unistd.h>
#endif
void GetMachineName(char machineName[150])
{
char Name[150];
int i=0;
#ifdef WIN32
TCHAR infoBuf[150];
DWORD bufCharCount = 150;
memset(Name, 0, 150);
if( GetComputerName( infoBuf, &bufCharCount ) )
{
for(i=0; i<150; i++)
{
Name[i] = infoBuf[i];
}
}
else
{
strcpy(Name, "Unknown_Host_Name");
}
#else
memset(Name, 0, 150);
gethostname(Name, 150);
#endif
strncpy(machineName,Name, 150);
}
答案 2 :(得分:2)
gethostname()
是获取本地主机名的POSIX方式。查看man
。
BSD函数getdomainname()
可以为您提供域名,以便您可以构建完全限定的主机名。没有POSIX方式来获取我害怕的域名。
答案 3 :(得分:0)
答案 4 :(得分:-1)
简单的方法,尝试uname()
如果这不起作用,请使用gethostname()然后使用gethostbyname(),最后使用gethostbyaddr()
hostent {}的h_name应该是您的FQDN