Come trovo il nome host completo della macchina corrente in C (nome host e informazioni dominio)?

In un progetto C (POSIX), come ottengo il nome completo per il sistema corrente?

Ad esempio, posso ottenere solo il nome host della mia macchina facendo gethostname() da unistd.h. Ciò potrebbe restituirmi machine3 in cambio, ma in realtà sto cercando machine3.somedomain.com ad esempio.

Come faccio a ottenere queste informazioni? Non voglio usare una chiamata a system () per farlo, se ansible.

Per ottenere un nome completo per una macchina, dobbiamo prima ottenere il nome host locale e quindi cercare il nome canonico.

Il modo più semplice per farlo è ottenere prima il nome host locale usando uname() o gethostname() e poi eseguendo una ricerca con gethostbyname() e guardando il membro h_name della struct che restituisce. Se si utilizza ANSI c, è necessario utilizzare uname() anziché gethostname() .

Esempio:

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

Sfortunatamente, gethostbyname() è deprecato nella specifica POSIX corrente, in quanto non funziona bene con IPv6. Una versione più moderna di questo codice userebbe getaddrinfo() .

Esempio:

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

Ovviamente, questo funzionerà solo se la macchina ha un FQDN da fornire – in caso contrario, il risultato di getaddrinfo() finisce per essere uguale al nome host non qualificato.

La mia soluzione:

 #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() è il modo POSIX per ottenere il nome host locale. Guarda l’ man .

La funzione BSD getdomainname() può darti il ​​nome di dominio in modo da poter creare un nome host completo. Non ho alcun modo POSIX per ottenere un dominio, temo.

Credo che tu stia cercando:

gethostbyaddress

Basta passarlo all’IP del localhost.

Esiste anche una funzione gethostbyname, che è anche utile.

Il modo semplice, prova uname ()

Se non funziona, usa gethostname () then gethostbyname () e infine gethostbyaddr ()

Il h_name di hostent {} dovrebbe essere il tuo FQDN