Вход/Регистрация
UNIX: разработка сетевых приложений
вернуться

Стивенс Уильям Ричард

Шрифт:

Самая основная функция, выполняющая поиск имени узла, — это функция

gethostbyname
. При успешном выполнении она возвращает указатель на структуру
hostent
, содержащую все адреса IPv4 для узла. Однако она может возвращать только адреса IPv4. В разделе 11.6 рассматривается функция, возвращающая адреса IPv4 и IPv6. Стандарт POSIX предупреждает, что функция
gethostbyname
может быть исключена из будущей его версии.

ПРИМЕЧАНИЕ

Маловероятно, что реализации gethostbyname исчезнут раньше, чем весь Интернет перейдет на протокол IPv6, а произойдет это еще очень не скоро. Однако удаление функции из стандарта POSIX гарантирует, что она не будет использоваться в новых программах. Вместо нее мы рекомендуем использовать getaddrinfo (раздел 11.6).

#include <netdb.h>

struct hostent *gethostbyname(const char * hostname);

Возвращает: непустой указатель в случае успешного выполнения, -1 в случае ошибки

Непустой указатель, возвращаемый этой функцией, указывает на следующую структуру

hostent
:

struct hostent {

char *h_name; /* официальное (каноническое) имя узла */

char **h_alihases; /* указатель на массив указателей на псевдонимы */

int h_addrtype; /* тип адреса узла: AF_INET */

int h_length; /* длина адреса: 4 */

char **h_addr_list; /* указатель на массив указателей с адресами IPv4 или IPv6 */

};

В терминах DNS функция

gethostbyname
выполняет запрос на запись типа А. Функция возвращает только адреса IPv4.

На рис. 11.2 представлено устройство структуры

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

Рис. 11.2. Структура hostent и ее одержимое

Возвращаемое имя

h_name
называется каноническим именем узла. Например, с показанными в предыдущем разделе записями CNAME каноническое имя узла
ftp://ftp.unpbook.com
будет иметь вид
linux.unpbook.com
. Также если мы вызываем функцию
gethostbyname
с узла
aix
с неполным именем, например
solaris
, то в качестве канонического имени возвращается полное доменное имя (FQDN)
solaris.unpbook.com.
.

ПРИМЕЧАНИЕ

Некоторые версии функции gethostbyname допускают, что аргумент hostname может быть записан в виде строки десятичных чисел, разделенных точками. То есть вызов в форме hptr = gethostbyname("206.62.226.33"); будет работать. Этот код был добавлен, поскольку клиент Rlogin принимает только имя узла, вызывая функцию gethostbyname, и не принимает точечно-десятичную запись [127]. Стандарт POSIX допускает это, но не устанавливает такое поведение в качестве обязательного, поэтому переносимое приложение не может использовать указанную особенность.

Функция

gethostbyname
отличается от других функций сокетов, описанных нами, тем, что она не задает значение переменной
errno
, когда происходит ошибка. Вместо этого она присваивает глобальной целочисленной переменной
h_errno
одну из следующих констант, определяемых в заголовке
<netdb.h>
:

HOST_NOT_FOUND
;

TRY_AGAIN
;

NO_RECOVERY
;

NO_DATA
(идентично
NO_ADDRESS
).

Ошибка

NO_DATA
означает, что заданное имя действительно, но у него нет записи типа А. Примером может служить имя узла, имеющего только запись типа MX.

Самые современные распознаватели предоставляют функцию

hstrerror
, которая в качестве единственного аргумента получает значение
h_errno
и возвращает указатель типа
const char*
на описание ошибки. Некоторые примеры строк, возвращаемых этой функцией, мы увидим в следующем примере.

Пример

В листинге 11.1 [1] показана простая программа, вызывающая функцию

gethostbyname
для любого числа аргументов командной строки и выводящая всю возвращаемую информацию.

Листинг 11.1. Вызов функции и вывод возвращаемой информации

//names/hostent.c

1 #include "unp.h"

2 int

3 main(int argc, char **argv)

1

Все исходные коды программ, опубликованные в этой книге, вы можете найти по адресу http://www.piter.com.

  • Читать дальше
  • 1
  • ...
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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