37

在 C 项目 (POSIX) 中,如何获取当前系统的完全限定名称?

例如,我可以通过 gethostname()从 unistd.h 获取我机器的主机名。这可能会给我machine3回报,但我实际上正在寻找machine3.somedomain.com例如。

我该如何获取这些信息?如果可能的话,我不想使用对 system() 的调用来执行此操作。

4

5 回答 5

62

要获得机器的完全限定名称,我们必须首先获得本地主机名,然后查找规范名称。

最简单的方法是首先使用uname()or获取本地主机名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()与不合格的主机名相同。

于 2009-02-03T00:08:17.007 回答
12

我的解决方案:

#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);
}
于 2011-11-25T10:50:37.040 回答
2

gethostname()是获取本地主机名的 POSIX 方式。退房man

BSD 功能getdomainname()可以为您提供域名,因此您可以构建完全限定的主机名。恐怕没有 POSIX 方法来获取域。

于 2009-02-02T21:17:58.190 回答
0

我相信您正在寻找:

通过地址获取主机

只需将 localhost IP 传递给它。

还有一个 gethostbyname 函数,也很有用。

于 2009-02-02T20:50:34.720 回答
-1

最简单的方法,试试 uname()

如果这不起作用,请使用 gethostname() 然后 gethostbyname() 最后 gethostbyaddr()

hostent{} 的 h_name 应该是您的 FQDN

于 2009-02-02T20:49:36.127 回答