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.
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é.
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 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.
Je crois que vous cherchez:
Il suffit de lui passer l'adresse IP localhost.
Il y a aussi une fonction gethostbyname, qui est également utile.
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