Книга: UNIX: разработка сетевых приложений

Глава 24

Глава 24

24.1. Да, разница есть. В первом примере два байта отсылаются с единственным срочным указателем, который указывает на байт, следующий за b. Во втором же примере (вызываются две функции) сначала отсылается символ a с указателем срочности, который указывает на следующий за ним байт, а за этим сегментом следует еще один TCP-сегмент, содержащий символ b с другим указателем срочности, указывающим на следующий за ним байт.

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: %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 }

Оглавление книги


Генерация: 0.145. Запросов К БД/Cache: 0 / 1
поделиться
Вверх Вниз