UNIX: разработка сетевых приложений
UNIX: разработка сетевых приложений читать книгу онлайн
Новое издание книги, посвященной созданию веб-серверов, клиент-серверных приложений или любого другого сетевого программного обеспечения в операционной системе UNIX, — классическое руководство по сетевым программным интерфейсам, в частности сокетам. Оно основано на трудах Уильяма Стивенса и полностью переработано и обновлено двумя ведущими экспертами по сетевому программированию. В книгу включено описание ключевых современных стандартов, реализаций и методов, она содержит большое количество иллюстрирующих примеров и может использоваться как учебник по программированию в сетях, так и в качестве справочника для опытных программистов.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
Исторически этот аргумент имел тип long без знака, что является некоторым излишеством. Достаточно будет типа int без знака. В Unix 98 для этого аргумента определяется новый тип — nfds_t.
Аргумент
timeouttimeoutТаблица 6.3. Значения аргумента timeout для функции poll
| Значение аргумента timeout | Описание |
|---|---|
| INFTIM | Ждать вечно |
| 0 | Возвращать управление немедленно, без блокирования |
| >0 | Ждать в течение указанного числа миллисекунд |
Константа
INFTIMPOSIX требует, чтобы константа INFTIM была определена в заголовочном файле <poll.h>, но многие системы все еще определяют ее в заголовочном файле <sys/stropts.h>.
Как и в случае функции select, любой тайм-аут, установленный для функции poll, ограничивается снизу разрешающей способностью часов в конкретной реализации (обычно 10 мс).
Функция
pollreventsЕсли нас больше не интересует конкретный дескриптор, достаточно установить элемент
fdpollfdeventsreventsВспомните наши рассуждения в конце раздела 6.3 относительно константы
FD_SETSIZEpollpollfdfd_setPOSIX требует наличия и функции select, и функции poll. Но если сравнивать их с точки зрения переносимости, то функцию select в настоящее время поддерживает больше систем, чем функцию poll. POSIX определяет также функцию pselect — усовершенствованную версию функции select, которая обеспечивает возможность блокирования сигналов и предоставляет лучшую разрешающую способность по времени, а для функции poll ничего подобного в POSIX нет.
6.11. Эхо-сервер TCP (еще раз)
Теперь мы изменим наш эхо-сервер TCP из раздела 6.8, используя вместо функции
selectpollselectclientrsetpollpollfdfdclientpollfdpollfdВ листинге 6.5 показана первая часть кода нашего сервера.
Листинг 6.5. Первая часть сервера TCP, использующего функцию poll
//tcpcliserv/tcpservpoll01.с 1 #include "unp.h" 2 #include <1imits.h> /* для OPEN_MAX */ 3 int 4 main(int argc, char **argv) 5 { 6 int i, maxi, listenfd, connfd, sockfd; 7 int nready; 8 ssize_t n; 9 char buf[MAXLINE];10 socklen_t clilen;11 struct pollfd client[OPEN_MAX];12 struct sockaddr_in cliaddr, servaddr;13 listenfd = Socket(AF_INET, SOCK_STREAM, 0);14 bzero(&servaddr, sizeof(servaddr));15 servaddr.sin_family = AF_INET;16 servaddr.sin_addr.s_addr = htonl(INADDR_ANY);17 servaddr.sin_port = htons(SERV_PORT);18 Bind(listenfd, (SA*)&servaddr, sizeof(servaddr));19 Listen(listenfd, LISTENQ);20 client[0].fd = listenfd;21 client[0].events = POLLRDNORM;22 for (i = 1; i < OPEN_MAX; i++)23 client[i].fd = -1; /* -1 означает, что элемент свободен */24 maxi = 0; /* максимальный индекс массива client[] */11pollfdOPEN_MAXsysconf_SC_OPEN_MAXsysconfOPEN_MAX
