Как найти полное имя хоста текущего компьютера в C (имя хоста и информация о домене)? - PullRequest
29 голосов
/ 02 февраля 2009

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

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

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

Ответы [ 5 ]

49 голосов
/ 03 февраля 2009

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

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

8 голосов
/ 25 ноября 2011

Мое решение:

#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);
}
2 голосов
/ 03 февраля 2009

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

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

0 голосов
/ 02 февраля 2009

Я полагаю, вы ищете:

gethostbyaddress

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

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

0 голосов
/ 02 февраля 2009

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

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

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

...