Уильям Стивенс - UNIX: разработка сетевых приложений

Тут можно читать онлайн Уильям Стивенс - UNIX: разработка сетевых приложений - бесплатно ознакомительный отрывок. Жанр: comp-osnet, издательство Питер, год 2007. Здесь Вы можете читать ознакомительный отрывок из книги онлайн без регистрации и SMS на сайте лучшей интернет библиотеки ЛибКинг или прочесть краткое содержание (суть), предисловие и аннотацию. Так же сможете купить и скачать торрент в электронном формате fb2, найти и слушать аудиокнигу на русском языке или узнать сколько частей в серии и всего страниц в публикации. Читателям доступно смотреть обложку, картинки, описание и отзывы (комментарии) о произведении.
  • Название:
    UNIX: разработка сетевых приложений
  • Автор:
  • Жанр:
  • Издательство:
    Питер
  • Год:
    2007
  • Город:
    Санкт-Петербург
  • ISBN:
    5-94723-991-4
  • Рейтинг:
    4.33/5. Голосов: 91
  • Избранное:
    Добавить в избранное
  • Отзывы:
  • Ваша оценка:
    • 80
    • 1
    • 2
    • 3
    • 4
    • 5

Уильям Стивенс - UNIX: разработка сетевых приложений краткое содержание

UNIX: разработка сетевых приложений - описание и краткое содержание, автор Уильям Стивенс, читайте бесплатно онлайн на сайте электронной библиотеки LibKing.Ru

Новое издание книги, посвященной созданию веб-серверов, клиент-серверных приложений или любого другого сетевого программного обеспечения в операционной системе UNIX, — классическое руководство по сетевым программным интерфейсам, в частности сокетам. Оно основано на трудах Уильяма Стивенса и полностью переработано и обновлено двумя ведущими экспертами по сетевому программированию. В книгу включено описание ключевых современных стандартов, реализаций и методов, она содержит большое количество иллюстрирующих примеров и может использоваться как учебник по программированию в сетях, так и в качестве справочника для опытных программистов.

UNIX: разработка сетевых приложений - читать онлайн бесплатно ознакомительный отрывок

UNIX: разработка сетевых приложений - читать книгу онлайн бесплатно (ознакомительный отрывок), автор Уильям Стивенс
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

После открытия /dev/pollпрограмма должна инициализировать массив структур pollfd(тех же, которые используются функцией poll, но в этом случае поле reventsне используется). Затем массив передается ядру вызовом write(структура записывается непосредственно в /dev/poll). После этого программа может вызывать ioctl DP_POLLи ждать событий. При вызове ioctlпередается следующая структура:

struct dvpoll {

struct pollfd* dp_fds;

int dp_nfds;

int dp_timeout;

};

Поле dp_fdsуказывает на буфер, используемый для хранения массива структур pollfd, возвращаемых вызовом ioctl. Поле dp_nfdsзадает размер буфера. Вызов ioctlблокируется до появления интересующих программу событий на любом из опрашиваемых дескрипторов, или до прохождения dp_timeoutмиллисекунд. При нулевом значении тайм-аута функция ioctlвозвращается немедленно (то есть данный способ может использоваться для реализации неблокируемых сокетов). Тайм-аут, равный -1, означает неопределенно долгое ожидание.

Измененный код функции str_cli, переписанной из листинга 6.2 с использованием /dev/poll, приведен в листинге 14.7.

Листинг 14.7. Функция str_cli, использующая /dev/poll

//advio/str_cli_poll03.c

1 #include "unp.h"

2 #include

3 void

4 str_cli(FILE *fp, int sockfd)

5 {

6 int stdineof;

7 char buf[MAXLINE];

8 int n;

9 int wfd;

10 struct pollfd pollfd[2];

11 struct dvpoll dopoll;

12 int i;

13 int result;

14 wfd = Open("/dev/poll", O_RDWR, 0);

15 pollfd[0].fd = fileno(fp);

16 pollfd[0].events = POLLIN;

17 pollfd[0].revents = 0;

18 pollfd[1].fd = sockfd;

19 pollfd[1].events = POLLIN;

20 pollfd[1].revents = 0;

21 Write(wfd, pollfd, sizeof(struct pollfd) * 2);

22 stdineof = 0;

23 for (;;) {

24 /* блокирование до готовности сокета */

25 dopoll.dp_timeout = -1;

26 dopoll.dp_nfds = 2;

27 dopoll.dp_fds = pollfd;

28 result = Ioctl(wfd, DP_POLL, &dopoll);

29 /* цикл по готовым дескрипторам */

30 for (i = 0; i < result; i++) {

31 if (dopoll.dp_fds[i].fd == sockfd) {

32 /* сокет готов к чтению */

33 if ((n = Read(sockfd, buf, MAXLINE)) == 0) {

34 if (stdineof == 1)

35 return; /* нормальное завершение */

36 else

37 err_quit("str_cli: server terminated prematurely");

38 }

39 Write(fileno(stdout), buf, n);

40 } else {

41 /* дескриптор готов к чтению */

42 if ((n = Read(fileno(fp), buf, MAXLINE)) == 0) {

43 stdineof = 1;

44 Shutdown(sockfd, SHUT_WR); /* отправка FIN */

45 continue;

46 }

47 Writen(sockfd, buf, n);

48 }

49 }

50 }

51 }

Составление списка дескрипторов для /dev/poll

14-21 Заполнив массив структур pollfd, мы передаем его в /dev/poll. В нашем примере используются только два файловых дескриптора, так что мы помещаем их в статический массив. На практике программы, использующие /dev/poll, обычно следят за сотнями или даже тысячами дескрипторов одновременно, поэтому массив выделяется динамически.

Ожидание данных

24-28 Программа не вызывает select, а блокируется в вызове ioctlв ожидании поступления данных. Возвращаемое значение представляет собой количество готовых к чтению дескрипторов файлов.

Цикл по дескрипторам

30-49 Наша программа относительно проста, потому что мы знаем, что дескрипторов всего два. В большой программе цикл будет более сложным. Возможно даже разделение программы на потоки для обработки данных, полученных по разным дескрипторам.

Интерфейс kqueue

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

#include

#include

#include

int kqueue(void);

int kevent(int kq , const struct kevent * changelist , int nchanges ,

struct kevent * eventlist , int nevents , const struct timespec * timeout );

void EV_SET(struct kevent * kev , uintptr_t ident , short filter ,

u_short flags , u_int fflags , intptr_t data , void * udata );

Функция kqueueвозвращает новый дескриптор kqueue, который может использоваться в последующих вызовах kevent. Функция keventприменяется для регистрации интересующих событий, а также для получения уведомлений об этих событиях. Параметры changelistи nchangesописывают изменения в предыдущем варианте списка событий. Если nchangesотлично от нуля, выполняются все запрошенные в структуре changelistизменения. Функция keventвозвращает количество событий или нуль, если произошел выход по тайм-ауту. В аргументе timeoutхранится значение тайм-аута, обрабатываемое подобно тому, как при вызове select( NULLдля блокирования, ненулевое значение для задания конкретного тайм- аута, а нулевое значение трактуется как необходимость неблокирующего вызова). Обратите внимание, что параметр timeoutимеет тип struct timespec, отличающийся от struct timevalв вызове selectтем, что первый имеет наносекундное разрешение, а второй — микросекундное.

Структура keventопределяется в заголовочном файле :

struct kevent {

uintptr_t ident; /* идентификатор (например, дескриптор файла) */

short filter; /* тип фильтра (например, EVFILT_READ) */

u_short flags; /* флаги действий (например, EV_ADD); */

u_int fflags; /* флаги, относящиеся к конкретным фильтрам */

intptr_t data; /* данные, относящиеся к конкретным фильтрам */

void uidata; /* непрозрачные пользовательские данные */

};

Действия по смене фильтра и флаговые возвращаемые значения приведены в табл. 14.5.

Таблица 14.5. Флаги для операций kevent

Значение flags Описание Изменяется Возвращается
EV_ADD Добавить новое событие, подразумевается по умолчанию, если не указан флаг EV_DISABLE
EV_CLEAR Сброс состояния события после считывания его пользователем
EV_DELETE Удаление события из фильтра
EV_DISABLE Отключение события без удаления его из фильтра
EV_ENABLE Включение отключенного перед этим события
EV_ONESHOT Удаление события после его однократного срабатывания
EV_EOF Достигнут конец файла
EV_ERROR Произошла ошибка, код errno записан в поле data

Типы фильтров приведены в табл. 14.6.

Таблица 14.6. Типы фильтров

Значение filter Описание
EVFILT_AIO События асинхронного ввода-вывода
EVFILT_PROC События exit, fork, exec для процесса
EVFILT_READ Дескриптор готов для чтения (аналогично select)
EVFILT_SIGNAL Описание сигнала
EVFILT_TIMER Периодические или одноразовые таймеры
EVFILT_VNODE Изменение и удаление файлов
EVFILT_WRITE Дескриптор готов для записи (аналогично select)

Перепишем функцию str_cliиз листинга 6.2 так, чтобы она использовала kqueue. Результат представлен в листинге 14.8.

Читать дальше
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать


Уильям Стивенс читать все книги автора по порядку

Уильям Стивенс - все книги автора в одном месте читать по порядку полные версии на сайте онлайн библиотеки LibKing.




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


Отзывы читателей о книге UNIX: разработка сетевых приложений, автор: Уильям Стивенс. Читайте комментарии и мнения людей о произведении.


Понравилась книга? Поделитесь впечатлениями - оставьте Ваш отзыв или расскажите друзьям

Напишите свой комментарий
x