Comment trouver le nom d’hôte complet de la machine actuelle en C (informations sur le nom d’hôte et le domaine)?

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

Par exemple, je peux obtenir uniquement le nom d’hôte de ma machine en effectuant gethostname() partir de 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 faire ceci, si possible.

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

La méthode la plus simple consiste à obtenir le nom d’hôte local à l’aide de uname() ou de gethostname() , puis à effectuer une recherche avec gethostbyname() et à regarder le membre h_name de la structure h_name . Si vous utilisez ANSI c, vous devez utiliser uname() place 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 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 nom de domaine complet à donner – sinon, le résultat de getaddrinfo() sera le même que le nom d’hôte non qualifié.

Ma solution:

 #ifdef WIN32 #include  #include  #else #include  #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 le moyen POSIX pour obtenir le nom d’hôte local. Découvrez l’ man .

La fonction BSD getdomainname() peut vous donner un nom de domaine afin que vous puissiez créer un nom d’hôte qualifié complet. Je crains qu’il n’y ait aucun moyen POSIX d’obtenir un domaine.

Je crois que vous recherchez:

gethostbyaddress

Il suffit de passer l’IP localhost.

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

Le moyen le plus simple, essayez uname ()

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

Le nom_h de hostent {} doit être votre nom de domaine complet.