Jak znaleźć pełną nazwę hosta bieżącego komputera w C (Nazwa hosta i informacje o domenie)?

W projekcie C (POSIX), jak uzyskać w pełni kwalifikowaną nazwę dla bieżącego systemu?

Na przykład, mogę uzyskać tylko nazwę hosta mojego komputera, wykonując gethostname() od unistd.h. to może dać mi machine3 w zamian, ale tak naprawdę Szukam machine3.somedomain.com na przykład.

Jak mam zdobyć te informacje? Nie chcę używać w tym celu wywołania system (), jeśli to możliwe.
Author: Zxaos, 2009-02-02

5 answers

Aby uzyskać w pełni kwalifikowaną nazwę maszyny, musimy najpierw pobrać lokalną nazwę hosta, a następnie wyszukać nazwę kanoniczną.

Najprostszym sposobem na to jest najpierw pobranie lokalnej nazwy hosta za pomocą uname() lub gethostname(), a następnie wykonanie wyszukiwania za pomocą gethostbyname() i przyjrzenie się elementowi h_name zwracanej struktury. Jeśli używasz ANSI c, musisz używać uname() zamiast gethostname().

Przykład:

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);

Niestety, {[4] } jest przestarzałe w bieżącym POSIX Specyfikacja, ponieważ nie gra dobrze z IPv6. Bardziej nowoczesna wersja tego kodu używałaby getaddrinfo().

Przykład:

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);

Oczywiście będzie to działać tylko wtedy, gdy maszyna ma FQDN do podania-jeśli nie, wynik getaddrinfo() będzie taki sam jak niekwalifikowana Nazwa hosta.

 58
Author: Zxaos,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-05-26 11:43:51

Moje rozwiązanie:

#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);
}
 9
Author: Bipul,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-20 12:59:12

gethostname() jest sposobem POSIX na uzyskanie nazwy lokalnego hosta. Zobacz man.

Funkcja BSD getdomainname() może dać Ci nazwę domeny, dzięki czemu możesz zbudować w pełni kwalifikowaną nazwę hosta. Obawiam się, że nie ma sposobu na uzyskanie domeny przez POSIX.

 2
Author: qrdl,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-02 21:40:14

Myślę, że szukasz:

Gethostbyaddress

Po prostu podaj adres IP localhost.

Istnieje również funkcja gethostbyname, która jest również przydatna.

 0
Author: Alex,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-02 20:50:34

Prosty sposób, spróbuj uname ()

Jeśli to nie zadziała, użyj gethostname (), następnie gethostbyname () i wreszcie gethostbyaddr ()

H_name of hostent {} powinien być twoim FQDN

 -1
Author: Jack L.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-02 20:49:36