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)?
-
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.
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:
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