Como faço para encontrar o hostname completo da máquina atual em C (hostname e informações de domínio)?

Em um projeto C (POSIX), como obtenho o nome totalmente qualificado para o sistema atual?

Por exemplo, posso obter apenas o nome do host da minha máquina fazendo gethostname() de unistd.h. Isso pode me dar machine3 em troca, mas na verdade estou procurando machine3.somedomain.com por exemplo.

Como faço para obter essa informação? Eu não quero usar uma chamada para system () para fazer isso, se possível.

Para obter um nome totalmente qualificado para uma máquina, primeiro devemos obter o nome do host local e, em seguida, procurar o nome canônico.

A maneira mais fácil de fazer isso é primeiro obter o nome do host local usando uname() ou gethostname() e, em seguida, executar uma pesquisa com gethostbyname() e observar o membro h_name da estrutura retornada. Se você estiver usando ANSI c, deverá usar uname() vez de gethostname() .

Exemplo:

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

Infelizmente, gethostbyname() está obsoleto na especificação POSIX atual, já que não funciona bem com o IPv6. Uma versão mais moderna desse código usaria getaddrinfo() .

Exemplo:

 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, isso só funcionará se a máquina tiver um FQDN para fornecer – se não, o resultado do getaddrinfo() será o mesmo do nome de host não qualificado.

Minha solução:

 #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() é uma maneira POSIX de obter o nome do host local. Confira man .

A function BSD getdomainname() pode fornecer seu nome de domínio para que você possa construir o nome completo do host. Não há nenhuma maneira POSIX para obter um domínio que tenho medo.

Eu acredito que você está procurando por:

gethostbyaddress

Apenas passe o IP do host local.

Há também uma function gethostbyname, que também é útil.

O caminho mais fácil, tente uname ()

Se isso não funcionar, use gethostname () gethostbyname () e finalmente gethostbyaddr ()

O nome do host {} deve ser seu FQDN