Gethostbyname в C

Я не знаю, как писать приложения на C, но мне нужна крошечная программа, которая делает:

lh = gethostbyname("localhost");
output = lh->h_name;

должна быть напечатана выходная переменная.

Приведенный выше код используется в драйвере базы данных PHP MongoDB для получения имени компьютера (имя хоста является частью ввода для генерации уникального идентификатора). Я скептически отношусь к тому, что это вернет имя хоста, поэтому я хотел бы получить некоторые доказательства.

Наиболее полезными могут быть любые примеры кода.

Счастливый день,

Матик

Ответ 1

#include <stdio.h>
#include <netdb.h>


int main(int argc, char *argv[])
{
    struct hostent *lh = gethostbyname("localhost");

    if (lh)
        puts(lh->h_name);
    else
        herror("gethostbyname");

    return 0;
}

Это не очень надежный способ определения имени хоста, хотя он иногда может работать. (то, что он возвращает, зависит от того, как настроен /etc/hosts). Если у вас есть строка, например:

127.0.0.1    foobar    localhost

... тогда он вернет "foobar". Если у вас есть другой способ, хотя и распространенный, то он просто вернет "localhost". Более надежным способом является использование функции gethostname():

#include <stdio.h>
#include <unistd.h>
#include <limits.h>

int main(int argc, char *argv[])
{
    char hostname[HOST_NAME_MAX + 1];

    hostname[HOST_NAME_MAX] = 0;
    if (gethostname(hostname, HOST_NAME_MAX) == 0)
        puts(hostname);
    else
        perror("gethostname");

    return 0;
}

Ответ 2

В C/UNIX эквивалент будет выглядеть примерно так:

#include <stdio.h>
#include <netdb.h>

int main (int argc, char *argv[]) {
    struct hostent *hstnm;
    if (argc != 2) {
        fprintf(stderr, "usage: %s hostname\n", argv[0]);
        return 1;
    }
    hstnm = gethostbyname (argv[1]);
    if (!hstnm)
        return 1;
    printf ("Name: %s\n", hstnm->h_name);
    return 0;
}

и доказательство того, что он работает:

$ hstnm localhost
Name: demon-a21pht

Но попробуйте сами. Если у вас есть правильная среда, все должно быть хорошо.

Ответ 3

что не так?

h_name

Официальное имя хоста (ПК). Если используя DNS или подобное разрешение системы, это полностью квалифицированный Доменное имя (FQDN), которое вызвало сервер для ответа. Если вы используете файл локальных хостов, это первый после адреса IPv4.