Как мне найти полное имя хоста текущей машины в C (имя хоста и информация о домене)?

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

  •  21-08-2019
  •  | 
  •  

Вопрос

Как мне получить полное имя для текущей системы в проекте на языке C (POSIX)?

Например, я могу получить только имя хоста моей машины, выполнив gethostname() из unistd.h.Это могло бы дать мне machine3 взамен, но на самом деле я ищу machine3.somedomain.com например.

Как мне получить эту информацию?Я не хочу использовать вызов system() для этого, если это возможно.

Это было полезно?

Решение

Чтобы получить полное имя для компьютера, мы должны сначала получить локальное имя хоста, а затем выполнить поиск по каноническому имени.

Самый простой способ сделать это - сначала получить локальное имя хоста, используя uname() или gethostname() и затем выполнение поиска с помощью gethostbyname() и , глядя на h_name член структуры, которую он возвращает.Если вы используете ANSI c, вы должен использование uname() вместо того , чтобы gethostname().

Пример:

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

К сожалению, gethostbyname() устарел в текущей спецификации POSIX, поскольку он плохо работает с IPv6.Более современная версия этого кода использовала бы getaddrinfo().

Пример:

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

Конечно, это сработает только в том случае, если у машины есть полное доменное имя для передачи - в противном случае результат getaddrinfo() в конечном итоге получается то же самое, что и неквалифицированное имя хоста.

Другие советы

Мое решение:

#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-способ получить имя локального хоста.Проверьте man.

Функция BSD getdomainname() может предоставить вам доменное имя, чтобы вы могли создать полное имя хоста.Боюсь, что в POSIX нет способа получить домен.

Я верю, что вы ищете:

gethostbyaddress - адрес хостинга

Просто передайте ему IP localhost.

Существует также функция gethostbyname, которая также полезна.

Самый простой способ, попробуйте uname()

Если это не сработает, используйте gethostname(), затем gethostbyname() и, наконец, gethostbyaddr()

H_name хостента{} должно быть вашим полным доменным именем

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top