UNIX: разработка сетевых приложений
UNIX: разработка сетевых приложений читать книгу онлайн
Новое издание книги, посвященной созданию веб-серверов, клиент-серверных приложений или любого другого сетевого программного обеспечения в операционной системе UNIX, — классическое руководство по сетевым программным интерфейсам, в частности сокетам. Оно основано на трудах Уильяма Стивенса и полностью переработано и обновлено двумя ведущими экспертами по сетевому программированию. В книгу включено описание ключевых современных стандартов, реализаций и методов, она содержит большое количество иллюстрирующих примеров и может использоваться как учебник по программированию в сетях, так и в качестве справочника для опытных программистов.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
24.2. В листинге Д.10 приведена версия программы с использованием функции
pollЛистинг Д.10. Версия программы из листинга 24.4, использующая функцию poll вместо функции select
//oob/tcprecv03p.c 1 #include "unp.h" 2 int 3 main(int argc, char **argv) 4 { 5 int listenfd, connfd, n, justreadoob = 0; 6 char buff[100]; 7 struct pollfd pollfd[1]; 8 if (argc == 2) 9 listenfd = Tcp_listen(NULL, argv[1], NULL);10 else if (argc == 3)11 listenfd = Tcp_listen(argv[1], argv[2], NULL);12 else13 err_quit("usage: tcprecv03p [ <host> ] <port#>");14 connfd = Accept(listenfd, NULL, NULL);15 pollfd[0].fd = connfd;16 pollfd[0].events = POLLRDNORM;17 for (;;) {18 if (justreadoob == 0)19 pollfd[0].events |= POLLRDBAND;20 Poll(pollfd, 1, INFTIM);21 if (pollfd[0].revents & POLLRDBAND) {22 n = Recv(connfd, buff, sizeof(buff) - 1, MSG_OOB);23 buff[n] = 0; /* завершающий нуль */24 printf("read %d OOB byte: %sn", n, buff);25 justreadoob = 1;26 pollfd[0].events &= ~POLLRDBAND; /* отключение бита */27 }28 if (pollfd[0].revents & POLLRDNORM) {29 if ((n = Read(connfd, buff, sizeof(buff) - 1)) == 0) {30 printf("received EOFn");31 exit(0);32 }33 buff[n] = 0; /* завершающий нуль */34 printf("read %d bytes %sn", n, buff);35 justreadoob = 0;36 }37 }38 }Глава 25
25.1. Нет, такая модификация приведет к ошибке. Проблема состоит в том, что
nqueuedg[iget]Глава 26
26.1. В примере с функцией
fork26.2. Обмена двумя последними сегментами завершения TCP-соединения (сегмент FIN сервера и сегмент ACK клиента в ответ на сегмент FIN сервера) не произойдет. Это переведет клиентский конец соединения в состояние FIN_WAIT_2 (см. рис. 2.4). Беркли-реализации прервут работу клиентского конца, если он остался в этом состоянии, по тайм-ауту через 11 минут [128, с. 825–827]. У сервера же в конце концов закончатся дескрипторы.
26.3. Это сообщение будет выводиться основным программным потоком в том случае, когда он считывает из сокета признак конца файла и при этом другой поток продолжает работать. Простейший способ выполнить это — объявить другую внешнюю переменную по имени
donecopytoГлава 27
27.1. Ничего не изменится. Все системы являются соседями, поэтому гибкая маршрутизация идентична жесткой.
27.2. Мы бы поместили EOL (нулевой байт) в конец буфера.
27.3. Поскольку программа
pingrecvfrom27.4. Потому что сервер
rlogindinetd27.5. Проблема заключается в том, что пятый аргумент функции
setsockoptОшибка оказалась безвредной, поскольку, как отмечалось, для отключения параметра сокета
IP_OPTIONSГлава 28
28.1. Недоступными являются поле номера версии и поле следующего заголовка в IPv6. Поле полезной длины доступно либо как аргумент одной из функций вывода, либо как возвращаемое значений одной из функций ввода, но если требуется параметр увеличенного поля данных (jumbo payload option), сам параметр приложению недоступен. Заголовок фрагментации также недоступен приложению.
28.2. В конце концов приемный буфер клиентского сокета заполнится, и при этом функция демона
writewriteWriteEWOULDBLOCK
