Comment puis-je trouver le nom d'hôte complet de la machine actuelle en C (nom d'hôte et informations de domaine)?

Dans un projet C (POSIX), Comment puis-je obtenir le nom complet du système actuel?

Par exemple, je peux obtenir juste le nom d'hôte de ma machine en faisant gethostname() de l'unistd.h. Cela pourrait me donner machine3 en retour, mais je cherche en fait machine3.somedomain.com par exemple.

Comment puis-je obtenir cette information? Je ne veux pas utiliser un appel à system() pour ce faire, si possible.

28
demandé sur Zxaos 2009-02-02 23:44:11

5 réponses

Pour obtenir le nom complet d'une machine, nous devons d'abord obtenir le nom d'hôte local, puis recherche le nom canonique.

La façon la plus simple de le faire est d'abord d'obtenir le nom d'hôte local en utilisant uname() ou gethostname(), puis d'effectuer une recherche avec gethostbyname() et de regarder le Membre h_name de la structure qu'il renvoie. Si vous utilisez ANSI c, vous devez utiliser uname() au lieu de gethostname().

Exemple:

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

Malheureusement, gethostbyname() est obsolète dans le POSIX actuel spécification, car il ne joue pas bien avec IPv6. Une version plus moderne de ce code utiliserait getaddrinfo().

Exemple:

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

Bien sûr, cela ne fonctionnera que si la machine a un nom de domaine complet à donner-sinon, le résultat de getaddrinfo() finit par être le même que le nom d'hôte non qualifié.

47
répondu Zxaos 2012-05-26 11:43:51

Ma solution:

#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);
}
8
répondu Bipul 2017-02-20 12:59:12

gethostname() est POSIX moyen d'obtenir le nom d'hôte local. Consultez man.

La fonction BSD getdomainname() peut vous donner un nom de domaine afin que vous puissiez créer un nom d'hôte complet. Il n'y a pas de moyen POSIX d'obtenir un domaine que je crains.

2
répondu qrdl 2009-02-02 21:40:14

Je crois que vous cherchez:

Gethostbyaddress

Il suffit de lui passer l'adresse IP localhost.

Il y a aussi une fonction gethostbyname, qui est également utile.

0
répondu Alex 2009-02-02 20:50:34

Le moyen facile, essayez uname ()

Si cela ne fonctionne pas, utilisez gethostname() puis gethostbyname() et, enfin, gethostbyaddr()

Le h_name de hostent {} devrait être votre nom de domaine complet

-1
répondu Jack L. 2009-02-02 20:49:36