在C项目(POSIX),我如何才能完全合格的名称为当前系统?

例如,我可以做让我的机器只是主机名 从unistd.h中gethostname()。这可能给我machine3的回报,但我实际上是寻找machine3.somedomain.com例如。

我如何去获得这些信息?我不想使用系统()的调用,如果能够做到这一点。

有帮助吗?

解决方案

要为一台机器得到一个完全合格的名字,我们必须首先获取本地主机名,然后查找的规范名称。

要做到这一点的最简单的方法是通过首先获得使用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 <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);
}

gethostname()是POSIX的方式来获得本地主机名。检查出man

BSD功能getdomainname()可以给你的域名,你可以建立完整的主机名。有没有POSIX的方式得到一个域名我害怕。

我相信你正在寻找:

gethostbyaddress

只要通过它本地主机IP

还有一个gethostbyname函数,这也是有用的。

在简单的方法,尝试UNAME()

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

hostent {}的h_name复制应该是你的FQDN

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top