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 else
13 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: %s\n", 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 EOF\n");
31 exit(0);
32 }
33 buff[n] = 0; /* завершающий нуль */
34 printf("read %d bytes %s\n", n, buff);
35 justreadoob = 0;
36 }
37 }
38 }
Глава 25
25.1. Нет, такая модификация приведет к ошибке. Проблема состоит в том, что
nqueue
dg[iget]
Глава 26
26.1. В примере с функцией
fork
26.2. Обмена двумя последними сегментами завершения TCP-соединения (сегмент FIN сервера и сегмент ACK клиента в ответ на сегмент FIN сервера) не произойдет. Это переведет клиентский конец соединения в состояние FIN_WAIT_2 (см. рис. 2.4). Беркли-реализации прервут работу клиентского конца, если он остался в этом состоянии, по тайм-ауту через 11 минут [128, с. 825–827]. У сервера же в конце концов закончатся дескрипторы.
26.3. Это сообщение будет выводиться основным программным потоком в том случае, когда он считывает из сокета признак конца файла и при этом другой поток продолжает работать. Простейший способ выполнить это — объявить другую внешнюю переменную по имени
done
copyto
Глава 27
27.1. Ничего не изменится. Все системы являются соседями, поэтому гибкая маршрутизация идентична жесткой.
27.2. Мы бы поместили EOL (нулевой байт) в конец буфера.
27.3. Поскольку программа
ping
recvfrom
27.4. Потому что сервер
rlogind
inetd
27.5. Проблема заключается в том, что пятый аргумент функции
setsockopt
Ошибка оказалась безвредной, поскольку, как отмечалось, для отключения параметра сокета
IP_OPTIONS
Глава 28
28.1. Недоступными являются поле номера версии и поле следующего заголовка в IPv6. Поле полезной длины доступно либо как аргумент одной из функций вывода, либо как возвращаемое значений одной из функций ввода, но если требуется параметр увеличенного поля данных (jumbo payload option), сам параметр приложению недоступен. Заголовок фрагментации также недоступен приложению.
28.2. В конце концов приемный буфер клиентского сокета заполнится, и при этом функция демона
write
write
Write
EWOULDBLOCK