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

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

Шрифт:
Инициализация

20-24
Мы используем первый элемент в массиве
client
для прослушиваемого сокета и присваиваем дескрипторам для оставшихся элементов -1. Мы также задаем в качестве аргумента функции
poll
событие
POLLRDNORM
, чтобы получить уведомление от этой функции в том случае, когда новое соединение будет готово к приему. Переменная
maxi
содержит максимальный индекс массива
client
, используемый в настоящий момент.

Вторая часть нашей функции приведена в листинге 6.6.

Листинг 6.6. Вторая часть сервера TCP, использующего функцию poll

//tcpcliserv/tcpservpoll01.c

25 for (;;) {

26 nready = Poll(client, maxi + 1, INFTIM);

27 if (client[0].revents & POLLRDNORM) { /* новое соединение

с клиентом */

28 clilen = sizeof(cliaddr);

29 connfd = Accept(listenfd. (SA*)&cliaddr, &clilen);

30 for (i = 1; i < OPEN_MAX; i++)

31 if (client[1].fd < 0) {

32 client[i].fd = connfd; /* сохраняем дескриптор */

33 break;

34 }

35 if (i == OPEN_MAX)

36 err_quit("too many clients");

37 client[i].events = POLLRDNORM;

38 if (i > maxi)

39 maxi = i; /* максимальный индекс в массиве client[] */

40 if (--nready <= 0)

41 continue; /* больше нет дескрипторов, готовых для чтения */

42 }

43 for (i = 1; i <= maxi; i++) { /* проверяем все клиенты на наличие

данных */

44 if ((sockfd = client[i].fd) < 0)

45 continue;

46 if (client[i].revents & (POLLRDNORM | POLLERR)) {

47 if ((n = Read(sockfd, buf, MAXLINE)) < 0) {

48 if (errno == ECONNRESET) {

49 /* соединение переустановлено клиентом */

50 Close(sockfd);

51 client[i].fd = -1;

52 } else

53 err_sys("readline error");

54 } else if (n == 0) {

55 /* соединение закрыто клиентом */

56 Close(sockfd);

57 client[i].fd = -1;

58 } else

59 Writen(sockfd, line, n);

60 if (--nready <= 0)

61 break; /* больше нет дескрипторов, готовых для чтения */

62 }

63 }

64 }

  • Читать дальше
  • 1
  • ...
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • ...

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

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

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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