如何在C(主机名和域信息)中找到当前计算机的完整主机名?
在C项目(POSIX)中,如何获取当前系统的完全限定名称?
例如,我可以通过从unistd.h执行gethostname()
来获取我的机器的主机名。 这可能会给我machine3
作为回报,但我实际上是在寻找machine3.somedomain.com
。
我如何获取此信息? 如果可能的话,我不想使用system()来执行此操作。
要获取计算机的完全限定名称,我们必须首先获取本地主机名,然后查找规范名称。
最简单的方法是首先使用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()
的结果最终与非限定主机名相同。
我的解决方案
#ifdef WIN32 #include #include #else #include #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); }
gethostname()
是获取本地主机名的POSIX方式。 看看man
。
BSD函数getdomainname()
可以为您提供域名,以便您可以构建完全限定的主机名。 没有POSIX方式来获取我害怕的域名。
我相信你在寻找:
gethostbyaddress
只需传递localhost IP即可。
还有一个gethostbyname函数,它也很有用。
简单的方法,尝试uname()
如果这不起作用,请使用gethostname()然后使用gethostbyname(),最后使用gethostbyaddr()
hostent {}的h_name应该是您的FQDN