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

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

Шрифт:

4. В руководстве Solaris 2.x для демона

inetd
описывается флаг
– t
, заставляющий демон
inetd
вызывать функцию
syslog
(с аргументами
facility=LOG_DAEMON
и
level=LOG_NOTICE
) для протоколирования клиентского IP-адреса и порта любой службы TCP, которые обрабатывает демон
inetd
. Как демон
inetd
получает эту информацию?

В этом же руководстве сказано, что демон

inetd
не может выполнить это для сокета UDP. Почему?

Есть ли способ обойти эти ограничения для служб UDP?

Глава 14

Дополнительные функции ввода-вывода

14.1. Введение

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

read
и
write
:
recv
и
send
, допускающие четвертый аргумент, содержащий флаги, передаваемые от процесса к ядру;
readv
и
writev
, позволяющие нам задавать массив буферов для ввода или вывода;
recvmsg
и
sendmsg
, объединяющие все свойства других функций ввода-вывода и обладающие новой возможностью получения и отправки вспомогательных данных.

Мы также рассказываем о том, как определить, сколько данных находится в приемном буфере сокета и как использовать с сокетами стандартную библиотеку ввода-вывода С, и обсуждаем более совершенные способы ожидания событий.

14.2. Тайм-ауты сокета

Существует три способа установки тайм-аута для операции ввода-вывода через сокет.

1. Вызов функции

alarm
, которая генерирует сигнал
SIGALRM
, когда истекает заданное время. Это подразумевает обработку сигналов, которая может варьироваться от одной реализации к другой. К тому же такой подход может стать помехой другим существующим вызовам функции
alarm
в данном процессе.

2. Блокирование при ожидании ввода-вывода в функции

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

3. Использование более новых параметров сокета —

SO_RCVTIMEO
и
SO_SNDTIMEO
. Проблема при использовании этого подхода заключается в том, что не все реализации поддерживают новые параметры сокетов.

Все три технологии работают с функциями ввода и вывода (такими как

read
,
write
и их вариациями, например
recvfrom
и
sendto
), но нам также хотелось бы иметь технологию, работающую с функцией
connect
, поскольку процесс соединения TCP может занять длительное время (обычно 75 с). Функцию
select
можно использовать для установки тайм-аута функции
connect
, только когда сокет находится в неблокируемом режиме (который мы рассматриваем в разделе 16.3), а параметры сокетов, устанавливающие тайм-аут, не работают с функцией
connect
. Мы также должны отметить, что первые две технологии работают с любым дескриптором, в то время как третья технология только с дескрипторами сокетов.

Теперь мы представим примеры применения всех трех технологий.

Тайм-аут для функции connect (сигнал SIGALRM)

В листинге 14.1 [1] показана наша функция

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

Листинг 14.1. Функция connect с тайм-аутом

1

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

//lib/connect_timeo.c

1 #include "unp.h"

2 static void connect_alarm(int);

3 int

4 connect_timeo(int sockfd, const SA *saptr, socklen_t salen, int nsec)

5 {

6 Sigfunc *sigfunc;

7 int n;

8 sigfunc = Signal(SIGALRM, connect_alarm);

9 if (alarm(nsec) != 0)

10 err_msg("connect_timeo: alarm was already set");

11 if ((n = connect(sockfd, saptr, salen)) < 0) {

12 close(sockfd);

13 if (errno == EINTR)

14 errno = ETIMEDOUT;

15 }

16 alarm(0); /* отключение alarm */

17 Signal(SIGALRM, sigfunc); /* восстанавливаем прежний обработчик

сигнала */

18 return (n);

19 }

20 static void

21 connect_alarm(int signo)

22 {

  • Читать дальше
  • 1
  • ...
  • 188
  • 189
  • 190
  • 191
  • 192
  • 193
  • 194
  • 195
  • 196
  • 197
  • 198
  • ...

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

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

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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