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.
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é.
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 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.
Je crois que vous cherchez:
Passez-lui simplement l'IP localhost.
Il existe également une fonction gethostbyname, qui est également utile.