Como faço para encontrar o nome do host completo da máquina atual em C (nome da máquina e informações de domínio)?
-
21-08-2019 - |
Pergunta
Em um projeto C (POSIX), como faço para obter o nome totalmente qualificado para o sistema atual?
Por exemplo, eu posso obter apenas o nome do host da minha máquina, fazendo
gethostname()
de unistd.h. Isso pode dar-me machine3
em troca, mas eu estou realmente procurando machine3.somedomain.com
por exemplo.
Como faço para ir de obter esta informação? Eu não quero usar uma chamada para system () para fazer isso, se possível.
Solução
Para obter um nome totalmente qualificado para uma máquina, é preciso primeiro obter o nome do host local, e, em seguida, procurar o nome canônico.
A maneira mais fácil de fazer isso é pela primeira recebendo o nome do host local usando uname()
ou gethostname()
e, em seguida, executando uma pesquisa com gethostbyname()
e olhando para o membro h_name
do struct ele retorna. Se você estiver usando ANSI C, você deve uso 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á obsoleta na especificação POSIX atual, uma vez que não joga bem com IPv6. Uma versão mais moderna deste 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);
Claro, isso só funcionará se a máquina tem um FQDN para dar -. Se não, o resultado das extremidades getaddrinfo()
por ser o mesmo que o nome do host não qualificado
Outras dicas
A minha solução:
#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 maneira de obter o nome do host local. Confira man
.
BSD função getdomainname()
pode dar-lhe o nome de domínio que você possa construir hostname totalmente qualificado. Não há nenhuma maneira POSIX para obter um domínio estou com medo.
Eu acredito que você está procurando:
Apenas passe-o IP localhost.
Há também uma função gethostbyname, que também é útil.
A maneira mais fácil, tente uname ()
Se isso não funcionar, o uso gethostname (), em seguida, gethostbyname () e, finalmente, gethostbyaddr ()
O h_name de hostent {} deve ser o seu FQDN