Come faccio a trovare piena hostname della macchina corrente in C (host e informazioni sul dominio)?

StackOverflow https://stackoverflow.com/questions/504810

  •  21-08-2019
  •  | 
  •  

Domanda

In un progetto C (POSIX), come faccio a ottenere il nome completo per il sistema attuale?

Per esempio, posso avere solo il nome host della mia macchina facendo gethostname() da unistd.h. Questo mi potrebbe dare machine3 in cambio, ma sto in realtà alla ricerca di machine3.somedomain.com per esempio.

Come posso fare per ottenere queste informazioni? Non voglio usare una chiamata a system () per fare questo, se possibile.

È stato utile?

Soluzione

Per ottenere un nome completo di una macchina, dobbiamo prima ottenere il nome dell'host locale, e quindi ricerca il nome canonico.

Il modo più semplice per farlo è attraverso il collegamento il nome dell'host locale utilizzando uname() o gethostname() e quindi eseguire una ricerca con gethostbyname() e guardando la h_name membro della struct restituisce. Se si utilizza ANSI C, deve usare getaddrinfo() invece di <=>.

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

Purtroppo, <=> è deprecato in specifiche POSIX corrente, in quanto non gioca bene con IPv6. Una versione più moderna di questo codice dovrebbe utilizzare <=>.

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

Naturalmente, questo funziona solo se la macchina ha un nome di dominio completo per dare -. In caso contrario, il risultato della <=> finisce per essere lo stesso del nome host non qualificato

Altri suggerimenti

La mia soluzione:

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

funzione BSD getdomainname() può dare nome di dominio in modo da poter costruire nome host completo. Non c'è modo POSIX per ottenere un dominio temo.

Credo che stai cercando:

gethostbyaddress

Basta passarlo l'IP localhost.

C'è anche una funzione di gethostbyname, che è anche utile.

Il modo più semplice, provare uname ()

Se questo non funziona, utilizzare gethostname () allora gethostbyname () ed infine gethostbyaddr ()

Il h_name di hostent {} dovrebbe essere il tuo nome di dominio completo

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top