Чтение онлайн

на главную - закладки

Жанры

Разработка приложений в среде Linux. Второе издание

Троан Эрик В.

Шрифт:

Параметр

h_addrtype
сообщает тип адреса хоста. В данной главе будет применяться только
AF_INET
. Приложения, которые создавались для поддержки IPv6, получат и другие типы адресов [147] . Следующий член
h_length
указывает длину двоичных адресов для данного хоста. Для адресов
AF_INET
эта длина равна
sizeof(struct in_addr)
. Последний элемент
h_addr_list
представляет собой массив указателей на адреса данного хоста, последний из которых
равен
NULL
для обозначения конца списка. Если
h_addrtype
равен
AF_INET
, то каждый указатель в этом списке указывает на структуру
struct in_addr
.

147

Наверное, не существует IPv6-программ, использующих

struct hostaddr
, однако они могут это делать. Функции, которые мы обсуждаем здесь, по умолчанию возвращают только информацию IPv4. Мы не будем рассматривать применение этих функций с IPv6.

Две библиотечные функции выполняют преобразования между IP-номерами и именами хостов. Первая из них

gethostbyname
возвращает
struct hostent
для имени хоста. Вторая —
gethostbyaddr
— возвращает информацию о машине с данным IP-адресом.

#include <netdb.h>

struct hostent * gethostbyname(const char * name);

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

Обе функции возвращают указатель на

struct hostent
. Структура может быть перезаписана при последующем вызове одной из функций, поэтому все значения, которые могут понадобиться позже, программа должна сохранять.

Функция

gethostbyname
принимает один параметр — строку, содержащую имя хоста. Функция
gethostbyaddr
принимает три параметра, которые вместе определяют адрес. Первый из них
addr
указывает на
struct in_addr
. Следующий
len
устанавливает длину информации, на которую указывает параметр
addr
. Последний
type
излагает тип адреса, который нужно преобразовать в имя хоста (
AF_INET
для IPv4-адресов).

Если во время поиска имени хоста происходят ошибки, то код ошибки передается в

h_errno
. Вызов функции
herror
распечатывает описание ошибки (данная функция почти идентична стандартной функции
perror
).

Единственный код ошибки, на котором тестируется большинство программ, это

NETDB_INTERNAL
, который указывает на неудачный системный вызов. При возвращении этой ошибки параметр errno содержит описание той проблемы, которая привела к отказу.

17.8.3. Пример поиска информации хоста с использованием унаследованных функций

Ниже приводится пример программы, использующей

inet_aton
,
inet_ntoa
,
gethostbyname
,
gethostbyaddr
. Она принимает единственный аргумент, который может быть либо именем хоста, либо IP-адресом в десятичном представлении
с точками. Она отыскивает хост и распечатывает все имена хоста и IP-адреса, ассоциированные с ним.

Любой аргумент, который является действительным десятичным адресом, считается IP-номером, а не именем хоста.

 1: /* lookup.с */

 2:

 3: /* Получает либо имя хоста, либо IP-адрес в командной строке, выводит

 4: каноническое имя хоста для данного хоста и все IP-номера и имена

 5: хостов, ассоциированные с ним. */

 6:

 7: #include <netdb.h> /* для gethostby* */

 8: #include <sys/socket.h>

 9: #include <netinet/in.h> /* для адресных структур */

10: #include <arpa/inet.h> /* для inet_ntoa */

11: #include <stdio.h>

12:

13: int main(int argc, const char ** argv) {

14: struct hostent * answer;

15: struct in_addr address, ** addrptr;

16: char ** next;

17:

18: if (argc != 2) {

19: fprintf(stderr, "поддерживается только одиночный аргумент\n");

20: return 1;

21: }

22:

23: /* Если аргумент выглядит как IP, то принимаем его как таковой

24: и выполняет обратный поиск имени */

25: if (inet_aton(argv[1], &address))

26: answer = gethostbyaddr((char *)&address, sizeof(address),

27: AF_INET);

28: else

29: answer = gethostbyname(argv[1])

30:

31: /* поиск имени хоста не удался */

32: if (!answer) {

33: herror("ошибка поиска хоста");

34: return 1;

35: }

36:

37: printf("Каноническое имя хоста: %s\n", answer->h_name);

38:

39: /* если есть псевдонимы, все они выводятся на печать */

40: if (answer->h_aliases[0]) {

41: printf("Псевдонимы:");

42: for(next = answer->h_aliases; *next; next++)

43: printf(" %s", *next);

44: printf("\n");

45: }

46:

47: /* отобразить все IP-адреса для данной машины */

48: printf("Адреса:");

49: for (addrptr = (structin_addr **) answer->h_addr_list;

50: *addrptr; addrptr++)

Поделиться:
Популярные книги

Отмороженный 8.0

Гарцевич Евгений Александрович
8. Отмороженный
Фантастика:
постапокалипсис
рпг
аниме
5.00
рейтинг книги
Отмороженный 8.0

Газлайтер. Том 14

Володин Григорий Григорьевич
14. История Телепата
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Газлайтер. Том 14

Ермак. Телохранитель

Валериев Игорь
2. Ермак
Фантастика:
альтернативная история
7.00
рейтинг книги
Ермак. Телохранитель

Матабар IV

Клеванский Кирилл Сергеевич
4. Матабар
Фантастика:
фэнтези
5.00
рейтинг книги
Матабар IV

Сборник коротких эротических рассказов

Коллектив авторов
Любовные романы:
эро литература
love action
7.25
рейтинг книги
Сборник коротких эротических рассказов

Идеальный мир для Лекаря 19

Сапфир Олег
19. Лекарь
Фантастика:
юмористическое фэнтези
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 19

Дочь моего друга

Тоцка Тала
2. Айдаровы
Любовные романы:
современные любовные романы
эро литература
5.00
рейтинг книги
Дочь моего друга

Свет Черной Звезды

Звездная Елена
6. Катриона
Любовные романы:
любовно-фантастические романы
5.50
рейтинг книги
Свет Черной Звезды

Кодекс Крови. Книга IV

Борзых М.
4. РОС: Кодекс Крови
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Крови. Книга IV

Идеальный мир для Лекаря 22

Сапфир Олег
22. Лекарь
Фантастика:
юмористическое фэнтези
аниме
фэнтези
5.00
рейтинг книги
Идеальный мир для Лекаря 22

Попаданка в академии драконов 4

Свадьбина Любовь
4. Попаданка в академии драконов
Любовные романы:
любовно-фантастические романы
7.47
рейтинг книги
Попаданка в академии драконов 4

Сердце Дракона. Том 12

Клеванский Кирилл Сергеевич
12. Сердце дракона
Фантастика:
фэнтези
героическая фантастика
боевая фантастика
7.29
рейтинг книги
Сердце Дракона. Том 12

Лолита

Набоков Владимир Владимирович
Проза:
классическая проза
современная проза
8.05
рейтинг книги
Лолита

Сводный гад

Рам Янка
2. Самбисты
Любовные романы:
современные любовные романы
эро литература
5.00
рейтинг книги
Сводный гад