UNIX: разработка сетевых приложений - Страница 396
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