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

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

Жанры

UNIX: разработка сетевых приложений
Шрифт:

Флаг

NI_NAMEREQD
приводит к возвращению ошибки, если имя узла не может быть разрешено при использовании DNS. Этот флаг может использоваться серверами, которым требуется, чтобы IP-адресу клиента было сопоставлено имя узла. Затем эти серверы получают возвращаемое имя узла, вызывают функцию
gethostbyname
и проверяют, совпадают ли результаты вызова этих двух функций хотя бы частично.

Флаг

NI_NOFQDN
вызывает сокращение имени узла, отбрасывая все, что идет после первой точки. Например, если в структуре адреса сокета содержится IP-адрес 192.168.42.2, то функция
gethostbyaddr
возвратит
имя
aix.unpbook.com
. Но если в функции
getnameinfo
задан флаг
NI_NOFQDN
, она возвратит в имени узла только
aix
.

Флаг

NI_NUMERICHOST
сообщает функции
getnameinfo
, что не нужно вызывать DNS (поскольку это занимает некоторое время). Вместо этого возвращается численное представление IP-адреса, вероятно, при помощи вызова функции
inet_ntop
. Аналогично, флаг
NI_NUMERICSERV
определяет, что вместо имени службы должен быть возвращен десятичный номер порта. Обычно серверы должны задавать этот флаг, поскольку номера портов клиента, как правило, не имеют соответствующего имени службы — это динамически назначаемые порты.
NI_NUMERICSCOPE
указывает на необходимость возвращения идентификатора области в численном, а не в текстовом виде.

Можно объединять несколько флагов путем логического сложения, если их сочетание имеет смысл, например

NI_DGRAM
и
NI_NUMERICHOST
.

11.18. Функции, допускающие повторное вхождение

Функция

gethostbyname
из раздела 11.3 имеет интересную особенность, которую мы еще не рассматривали: она не допускает повторное вхождение (nonreentrant). Мы еще столкнемся с этой проблемой в главе 23, когда будем обсуждать потоки, но не менее интересно найти решение этой проблемы сейчас, без необходимости обращаться к понятию потоков.

Сначала посмотрим, как эта функция работает. Если мы изучим ее исходный код (это несложно, поскольку исходный код для всей реализации BIND свободно доступен), то увидим, что обе функции — и

gethostbyname
, и
gethostbyaddr
— содержатся в одном файле, который имеет следующий вид:

staticstruct hostent host; /* здесь хранится результат */

struct hostent*

gethostbyname(const char *hostname) {

return(gethostbyname2(hostname, family));

}

struct hostent*

gethostbyname2(const char *hostname, int family) {

/* вызов функций DNS для запроса А или AAAA */

/* заполнение структуры адреса узла */

return(&host);

}

struct hostent*

gethostbyaddr(const char *addr, size_t len, int family) {

/* вызов функций DNS для запроса PTR в домене in-addr.arpa */

/*
заполнение структуры адреса узла */

return(&host);

}

Мы выделили полужирным шрифтом спецификатор класса памяти

static
итоговой структуры, потому что основная проблема в нем. Тот факт, что эти три функции используют общую переменную
host
, представляет другую проблему, которую мы обсудим в упражнении 11.1. (Вспомните табл. 11.4.) Функция
gethostbyname2
появилась в BIND 4.9.4 с добавлением поддержки IPv6. Мы будем игнорировать тот факт, что когда мы вызываем функцию
gethostbyname
, задействуется функция
gethostbyname2
, поскольку это не относится к предмету обсуждения.

Проблема повторного вхождения может возникнуть в нормальном процессе Unix, вызывающем функцию

gethostbyname
или
gethostbyaddr
и из управляющего элемента главного потока, и из обработчика сигнала. Когда вызывается обработчик сигнала (допустим, это сигнал
SIGALRM
, который генерируется раз в секунду), главный поток управляющего элемента процесса временно останавливается и вызывается функция обработки сигнала. Рассмотрим следующую ситуацию:

main {

struct hostent *hptr;

...

signal(SIGALRM, sig_alrm);

...

hptr = gethostbyname( ... );

...

}

void

sig_alrm(int signo) {

struct hostent *hptr;

...

hptr = gethostbyname( ... );

...

}

Если главный поток управления в момент остановки находится в середине выполнения функции

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

Если мы посмотрим на функции преобразования имен и адресов, представленные в этой главе и в главе 9, вместе с функциями

inet_ XXX
из главы 4, мы заметим следующее:

Функции

gethostbyname
,
gethostbyname2
,
gethostbyaddr
,
getservbyname
и
getservbyport
традиционно не допускают повторного вхождения, поскольку все они возвращают указатель на статическую структуру.

Некоторые реализации, поддерживающие программные потоки (Solaris 2.x), предоставляют версии этих четырех функций, допускающие повторное вхождение, с именами, оканчивающимися суффиксом

_r
. О них рассказывается в следующем разделе.

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

Александр Агренев. Трилогия

Кулаков Алексей Иванович
Александр Агренев
Фантастика:
альтернативная история
9.17
рейтинг книги
Александр Агренев. Трилогия

Пустоши

Сай Ярослав
1. Медорфенов
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Пустоши

Барон нарушает правила

Ренгач Евгений
3. Закон сильного
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Барон нарушает правила

Вперед в прошлое 3

Ратманов Денис
3. Вперёд в прошлое
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Вперед в прошлое 3

На границе империй. Том 9. Часть 2

INDIGO
15. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 9. Часть 2

Афганский рубеж

Дорин Михаил
1. Рубеж
Фантастика:
попаданцы
альтернативная история
7.50
рейтинг книги
Афганский рубеж

Совпадений нет

Безрукова Елена
Любовные романы:
любовно-фантастические романы
5.50
рейтинг книги
Совпадений нет

Идеальный мир для Социопата 13

Сапфир Олег
13. Социопат
Фантастика:
боевая фантастика
постапокалипсис
рпг
5.00
рейтинг книги
Идеальный мир для Социопата 13

Наследник в Зеркальной Маске

Тарс Элиан
8. Десять Принцев Российской Империи
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Наследник в Зеркальной Маске

Королевская Академия Магии. Неестественный Отбор

Самсонова Наталья
Любовные романы:
любовно-фантастические романы
8.22
рейтинг книги
Королевская Академия Магии. Неестественный Отбор

Proxy bellum

Ланцов Михаил Алексеевич
5. Фрунзе
Фантастика:
попаданцы
альтернативная история
4.25
рейтинг книги
Proxy bellum

Светлая ведьма для Темного ректора

Дари Адриана
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Светлая ведьма для Темного ректора

Матабар. II

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

Академия

Сай Ярослав
2. Медорфенов
Фантастика:
юмористическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Академия