Массив in_addr - PullRequest
       18

Массив in_addr

0 голосов
/ 26 ноября 2009

Я хотел бы создать массив in_addr, используя gethostbyname (). Посмотрев в Google, я нашел этот короткий код (на http://www.logix.cz/michal/devel/various/gethostbyname.c.xp):

/*
 * gethostbyname.c - Example of using gethostbyname(3)
 * Martin Vidner <mvidner@suse.cz>
 */

#include <stdio.h>
#include <netdb.h>
#include <netinet/in.h>

struct hostent *he;
struct in_addr a;

int
main (int argc, char **argv)
{
    if (argc != 2)
    {
        fprintf(stderr, "usage: %s hostname\n", argv[0]);
        return 1;
    }
    he = gethostbyname (argv[1]);
    if (he)
    {
        printf("name: %s\n", he->h_name);
        while (*he->h_aliases)
            printf("alias: %s\n", *he->h_aliases++);
        while (*he->h_addr_list)
        {
            bcopy(*he->h_addr_list++, (char *) &a, sizeof(a));
            printf("address: %s\n", inet_ntoa(a));
        }
    }
    else
        herror(argv[0]);
    return 0;
}

Я проверил этот код следующим образом:

$ ./a.out google.com
name: google.com
address: 74.125.45.100
address: 74.125.53.100
address: 74.125.67.100

Увидев этот результат, я удовлетворен, потому что хотел получить список IP-адресов из домена.

Но у меня только одна проблема: я не знаю, как сохранить этот список IP-адресов в массиве (с тем же размером, что и номер адреса) ... У вас есть пример случайно?

Спасибо

1 Ответ

2 голосов
/ 26 ноября 2009

Структура hostentry уже предоставляет список IP-адресов в виде массива ( MSDN ). В вашем примере кода это называется he->h_addr_list, однако его обход с использованием *he->h_addr_list++ теряет вашу ссылку на него.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...