Читаем Разработка приложений в среде 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.

Две библиотечные функции выполняют преобразования между IP-номерами и именами хостов. Первая из них gethostbyname() возвращает struct hostent для имени хоста. Вторая — gethostbyaddr() — возвращает информацию о машине с данным IP-адресом.

#include

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 содержит описание той проблемы, которая привела к отказу.

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

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

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

 1: /* lookup.с */

 2:

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

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

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

 6:

 7: #include /* для gethostby* */

 8: #include

 9: #include /* для адресных структур */

10: #include /* для inet_ntoa() */

11: #include

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:

Перейти на страницу:

Похожие книги

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

Финансы / Программирование, программы, базы данных