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

StackOverflow https://stackoverflow.com/questions/504810

  •  21-08-2019
  •  | 
  •  

Question

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 Unistd.h de gethostname(). Cela pourrait me donner en retour machine3, mais je suis à la recherche par exemple pour machine3.somedomain.com.

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

Était-ce utile?

La solution

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

La meilleure façon de le faire est d'abord obtenir le nom d'hôte local en utilisant ou uname() puis effectuer gethostname() une recherche avec et en regardant gethostbyname() le membre du h_name struct il retourne. Si vous utilisez c ANSI, vous doit utiliser au lieu de getaddrinfo() <=>.

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, est dépréciée dans <=> la spécification actuelle POSIX, car il ne joue pas bien avec IPv6. Une version plus moderne de ce code utiliserait <=>.

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 pour donner -. Sinon, le résultat de la <=> finit par être le même que le nom d'hôte non qualifié

Autres conseils

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

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

fonction BSD peut vous donner getdomainname() nom de domaine afin que vous pouvez construire le nom d'hôte qualifié. Il n'y a aucun moyen d'obtenir POSIX un domaine que je crains.

Je crois que vous cherchez:

GetHostByAddress

Il suffit de passer l'adresse IP localhost.

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

La façon simple, essayez uname ()

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

Le h_name de hostent {} devrait être votre FQDN

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top