web-dev-qa-db-fra.com

Comment 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() depuis unistd.h. Cela pourrait me donner machine3 en retour, mais je cherche en fait machine3.somedomain.com par exemple.

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

29
Zxaos

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

Pour ce faire, la méthode la plus simple consiste à obtenir d'abord le nom d'hôte local à l'aide de uname() ou gethostname(), puis à effectuer une recherche avec gethostbyname() et à consulter le h_name membre de la structure renvoyée. Si vous utilisez c ANSI, vous devez utilisez 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 déconseillé dans la spécification POSIX actuelle, car il ne fonctionne 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 FQDN à donner - sinon, le résultat de la getaddrinfo() finira par être le même que le nom d'hôte non qualifié.

50
Zxaos

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);
}
9
Bipul

gethostname() est un moyen POSIX pour obtenir le nom d'hôte local. Découvrez 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 aucun moyen POSIX d'obtenir un domaine, je le crains.

2
qrdl

Je crois que vous cherchez:

gethostbyaddress

Passez-lui simplement l'IP localhost.

Il existe également une fonction gethostbyname, qui est également utile.

0
Alex