UNIX: разработка сетевых приложений
Шрифт:
8 err_quit("usage: icmpd");
9 maxi = -1; /* индекс массива client[] */
10 for (i = 0; i < FD_SETSIZE; i++)
11 client[i].connfd = -1; /* -1 означает свободный элемент */
12 FD_ZERO(&allset);
13 fd4 = Socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
14 FD_SET(fd4, &allset);
15 maxfd = fd4;
16 #ifdef IPV6
17 fd6 = Socket(AF_INET6, SOCK_RAW, IPPROTO_ICMPV6);
18 FD_SET(fd6, &allset);
19 maxfd = max(maxfd, fd6);
20 #endif
21 listenfd = Socket(AF_UNIX, SOCK_STREAM, 0);
22 sun.sun_family = AF_LOCAL;
23 strcpy(sun.sun_path, ICMPD_PATH);
24 unlink(ICMPD_PATH);
25 Bind(listenfd, (SA*)&sun, sizeof(sun));
26 Listen(listenfd, LISTENQ);
27 FD_SET(listenfd, &allset);
28 maxfd = max(maxfd, listenfd);
Инициализация
массива client
9-10
Инициализируется массив client
путем присваивания значения -1 элементу присоединенного сокета. Создание сокетов
12-28
Создаются три сокета: символьный сокет ICMPv4, символьный сокет ICMPv6 и потоковый доменный сокет Unix. Мы связываем при помощи функции bind
свое заранее известное полное имя с сокетом и вызываем функцию listen
. Это сокет, к которому клиенты присоединяются с помощью функции connect
. Для функции select
также вычисляется максимальный дескриптор, а для вызовов функции accept
в памяти размещается структура адреса сокета. В листинге 28.25 приведена вторая часть функции
main
. Она содержит бесконечный цикл, вызывающий функцию select
в ожидании, когда будет готов к чтению какой-либо из дескрипторов демона. Листинг 28.25. Вторая часть функции main: обработка готового к чтению дескриптора
//icmpd/icmpd.c
29 for (;;) {
30 rset = allset;
31 nready = Select(maxfd+1, &rset, NULL, NULL, NULL);
32 if (FD_ISSET(listenfd, &rset))
33 if (readable_listen <= 0)
34 continue;
35 if (FD_ISSET(fd4, &rset))
36 if (readable_v4 <= 0)
37 continue;
38 #ifdef IPV6
39 if (FD_ISSET(fd6, &rset))
40 if (readable_v6 <= 0)
41 continue;
42 #endif
43 for (i = 0; i <= maxi; i++) { /* проверка всех клиентов */
44 if ( (sockfd = client[i].connfd) < 0)
45 continue;
46 if (FD_ISSET(sockfd, &rset))
47 if (readable_conn(i) <= 0)
48 break; /* готовых дескрипторов больше нет */
49 }
50 }
51 exit(0);
52 }
Проверка прослушиваемого доменного сокета Unix
32-34
Прослушиваемый доменный сокет Unix проверяется в первую очередь, и если он готов, запускается функция readable_listen
. Переменная nready
— количество дескрипторов, которое функция select возвращает как готовые к чтению — является глобальной. Каждая из наших функций readablе_XXX
уменьшает ее значение на 1, и новое значение этой переменной является возвращаемым значением функции. Когда ее значение достигает нуля, это говорит о том, что все готовые к чтению дескрипторы обработаны, и поэтому функция select
вызывается снова. Проверка символьных сокетов ICMP
35-42
Проверяется символьный сокет ICMPv4, а затем символьный сокет ICMPv6. Проверка присоединенных доменных сокетов Unix
43-49
Затем проверяется, готов ли для чтения какой-нибудь из присоединенных доменных сокетов Unix. Готовность для чтения какого-либо из таких сокетов обозначает, что клиент отослал дескриптор или завершился. В листинге 28.26 приведена функция
readable_listen
, вызываемая, когда прослушиваемый сокет готов для чтения. Это указывает на новое клиентское соединение. Листинг 28.26. Обработка нового соединения клиента
//icmpd/readablе_listen.c
1 #include "icmpd.h"
2 int
3 readable_listen(void)
4 {
5 int i, connfd;
6 socklen_t clilen;
7 clilen = sizeof(cliaddr);
8 connfd = Accept(listenfd, (SA*)&cliaddr, &clilen);
Поделиться:
Популярные книги
Случайная жена для лорда Дракона
Фантастика:
юмористическая фантастика
попаданцы
5.00
рейтинг книги
Идеальный мир для Лекаря 7
7. Лекарь
Фантастика:
юмористическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Релокант. Вестник
2. Релокант в другой мир
Фантастика:
фэнтези
попаданцы
рпг
5.00
рейтинг книги
По дороге пряностей
2. Венецианский купец
Фантастика:
фэнтези
героическая фантастика
альтернативная история
5.50
рейтинг книги
Искушение генерала драконов
2. Генералы драконов
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Царь Федор. Трилогия
Царь Федор
Фантастика:
альтернативная история
8.68
рейтинг книги
Идеальный мир для Социопата 4
4. Социопат
Фантастика:
боевая фантастика
6.82
рейтинг книги
Охота на попаданку. Бракованная жена
Любовные романы:
любовно-фантастические романы
5.60
рейтинг книги
Решала
10. Девяностые
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Приручитель женщин-монстров. Том 7
7. Покемоны? Какие покемоны?
Фантастика:
юмористическое фэнтези
аниме
5.00
рейтинг книги
Месть за измену
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Медиум
1. О чем молчат могилы
Фантастика:
фэнтези
7.90
рейтинг книги
Вернуть невесту. Ловушка для попаданки 2
2. Вернуть невесту
Любовные романы:
любовно-фантастические романы
7.88
рейтинг книги
Партиец
2. Переломный век
Фантастика:
попаданцы
альтернативная история
5.00