gethostbyname в C - PullRequest
       14

gethostbyname в C

11 голосов
/ 19 мая 2010

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

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

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

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

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

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

Ответы [ 3 ]

19 голосов
/ 19 мая 2010
#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;
}
6 голосов
/ 19 мая 2010

В 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

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

2 голосов
/ 19 мая 2010

что не так?

h_name

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

...