Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

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

Самый простой способ сделать это - сначала получить локальное имя хоста с помощью 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() заканчивается тем же, что и для неквалифицированного имени хоста.

Ответ 2

Мое решение:

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

Ответ 3

gethostname() - это способ POSIX для получения имени локального узла. Проверьте man.

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

Ответ 4

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

gethostbyaddress

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

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

Ответ 5

Простой способ, попробуйте uname()

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

h_name hostent {} должно быть вашим FQDN