Получить 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
|