Вход/Регистрация
UNIX: разработка сетевых приложений
вернуться

Стивенс Уильям Ричард

Шрифт:

75 struct sockaddr *cli;

76 cli = Malloc(salen);

77 for (;;) {

78 len = salen;

79 n = Recvfrom(sockfd, mesg, MAXLINE, 0, cli, &len);

80 printf("child %d, datagram from %s",

81 getpid, Sock_ntop(cli, len));

82 printf(", to %s\n", Sock_ntop(myaddr, salen));

83 Sendto(sockfd, mesg, n, 0, cli, len),

84 }

85 }

Глава 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: %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
будет использоваться 101 дескриптор, один прослушиваемый сокет и 100 присоединенных сокетов. Но каждый из 101 процесса (один родительский и 100 дочерних) имеет только один открытый дескриптор (игнорируем все остальные, такие как стандартный поток ввода, если сервер не является демоном). В случае сервера с потоками используется 101 дескриптор для одного процесса. Каждым потоком (включая основной) обрабатывается один дескриптор.

  • Читать дальше
  • 1
  • ...
  • 497
  • 498
  • 499
  • 500
  • 501
  • 502
  • 503
  • 504
  • 505
  • 506
  • 507

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: