Это архив сайта coldflame.by.ru, он не обновлялся с 2007 года. Мой современный сайт тут: http://leonid.shevtsov.me.
Домой! Обо мне Специально для РИ-06-1 Разнообразное... барахло, короче :) Программы и прочее Статьи и переводы Блог SmartDaemon
Предыдущая ОглавлениеСледующая

gethostbyname(), gethostbyaddr()

Получить IP-адрес по имени, и наоборот

Прототипы

#include <sys/socket.h>
#include <netdb.h>

struct hostent *gethostbyname(const char *name);
struct hostent *gethostbyaddr(const char *addr, int len, int type);

Описание

Эти функции преобразовывают имена хостов в IP-адреса и наоборот. Ведь для connect() нужен IP, да? Почему-то никто не хочет запоминать IP-адреса. Так дай пользователям возможность писать "www.yahoo.com" вместо "66.94.230.35".

gethostbyname() берет строку вроде "www.yahoo.com" и возвращает struct hostent, хранящую массу разной информации, включая IP-адрес (А также официальное название хоста, список псевдонимов, тип адреса, длину адресов и список адресов - это многоцелевая структура, которую легко использовать в наших конкретных задачах.)

gethostbyaddr() берет struct in_addr и возвращает соответствующее имя хоста (если оно есть), это как ьы обратная функция от gethostbyname(). Несмотря на то, что addr это char*, ты будешь передавать указатель на struct in_addr. len должна быть равна sizeof(struct in_addr), а type должен быть AF_INET.

И что это за возвращаемая struct hostent? У нее есть разные поля для хранения инфоромации о хосте.

char *h_name

Настоящее, официальное имя хоста.

char **h_aliases

Список псевдонимов хоста - он заканчивается нулевым указателем.

int h_addrtype

Тип адреса, должен быть AF_INET...

int length

Длина адреса в байтах, 4 для адресов IPv4.

char **h_addr_list

Список IP-адресов хоста. Хотя тип char**, на самом деле это список struct in_addr*. Последний элемент списка NULL.

h_addr

Часто употребляемый псевдоним для h_addr_list[0]. Если тебе нужен всего один адрес хоста (а их может быть и несколько), используй это поле.

Возвращаемое значение

Возвращает указатель на результативную struct hostent, или NULL при ошибке.

Вместо обычной perror() и всей процедуры сообщения об ошибках, эти функции сообщают номер ошибки в переменной h_errno, которая может быть напечатана с помощью herror() или hstrerror(). Это работает так же, как и классическая система errno, perror(), и strerror().

Пример

int i;
struct hostent *he;
struct in_addr **addr_list;
struct in_addr addr;

// получить адреса www.yahoo.com:

he = gethostbyname("www.yahoo.com");
if (he == NULL) { // проверяем на ошибки
    herror("gethostbyname"); // herror(), а НЕ perror()
    exit(1);
}

// выводим информацию о хосте:
printf("официальное имя: %s\n", he->h_name);
printf("IP-адрес       : %s\n", inet_ntoa(*(struct in_addr*)he->h_addr));
printf("Все адреса     : ");
addr_list = (struct in_addr **)he->h_addr_list;
for(i = 0; addr_list[i] != NULL; i++) {
    printf("%s ", inet_ntoa(*addr_list[i]));
}
printf("\n");

// получить имя хоста с адресом 66.94.230.32:

inet_aton("66.94.230.32", &addr);
he = gethostbyaddr(&addr, sizeof(addr), AF_INET);

printf("Имя хоста: %s\n", he->h_name);

См. также

gethostname(), errno, perror(), strerror(), struct in_addr


Предыдущая ОглавлениеСледующая