UNIX: разработка сетевых приложений
UNIX: разработка сетевых приложений читать книгу онлайн
Новое издание книги, посвященной созданию веб-серверов, клиент-серверных приложений или любого другого сетевого программного обеспечения в операционной системе UNIX, — классическое руководство по сетевым программным интерфейсам, в частности сокетам. Оно основано на трудах Уильяма Стивенса и полностью переработано и обновлено двумя ведущими экспертами по сетевому программированию. В книгу включено описание ключевых современных стандартов, реализаций и методов, она содержит большое количество иллюстрирующих примеров и может использоваться как учебник по программированию в сетях, так и в качестве справочника для опытных программистов.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
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 else37 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 }14-21pollfd/dev/poll/dev/poll24-28selectioctl30-49Интерфейс kqueue
Система FreeBSD версии 4.1 предложила сетевым программистам новый интерфейс, получивший название
kqueuekqueue#include <sys/types.h>#include <sys/event.h>#include <sys/time.h>int kqueue(void);int kevent(int <i>kq</i>, const struct kevent *<i>changelist</i>, int <i>nchanges</i>, struct kevent *<i>eventlist</i>, int <i>nevents</i>, const struct timespec *<i>timeout</i>);void EV_SET(struct kevent *<i>kev</i>, uintptr_t <i>ident</i>, short <i>filter</i>, u_short <i>flags</i>, u_int <i>fflags</i>, intptr_t <i>data</i>, void *<i>udata</i>);Функция
kqueuekqueuekeventkeventchangelistnchangesnchangeschangelistkeventtimeoutselectNULLtimeoutstruct timespecstruct timevalselectСтруктура
kevent<sys/event.h>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
