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 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 }
14-21
pollfd
/dev/poll
/dev/poll
24-28
select
ioctl
30-49
Интерфейс kqueue
Система FreeBSD версии 4.1 предложила сетевым программистам новый интерфейс, получивший название
kqueue
kqueue
#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>);
Функция
kqueue
kqueue
kevent
kevent
changelist
nchanges
nchanges
changelist
kevent
timeout
select
NULL
timeout
struct timespec
struct timeval
select
Структура
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