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

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

  •  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.

Foi útil?

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:

GetHostByAddress

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top