Чтение онлайн

на главную - закладки

Жанры

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);

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

Курсант: назад в СССР

Дамиров Рафаэль
1. Курсант
Фантастика:
попаданцы
альтернативная история
7.33
рейтинг книги
Курсант: назад в СССР

Чужая семья генерала драконов

Лунёва Мария
6. Генералы драконов
Фантастика:
фэнтези
5.00
рейтинг книги
Чужая семья генерала драконов

Пышка и Герцог

Ордина Ирина
Фантастика:
юмористическое фэнтези
историческое фэнтези
фэнтези
5.00
рейтинг книги
Пышка и Герцог

Имперский Курьер. Том 5

Бо Вова
5. Запечатанный мир
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Имперский Курьер. Том 5

Имя нам Легион. Том 7

Дорничев Дмитрий
7. Меж двух миров
Фантастика:
боевая фантастика
рпг
аниме
5.00
рейтинг книги
Имя нам Легион. Том 7

Возвышение Меркурия

Кронос Александр
1. Меркурий
Фантастика:
героическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Возвышение Меркурия

Законы Рода. Том 11

Андрей Мельник
11. Граф Берестьев
Фантастика:
юмористическое фэнтези
аниме
фэнтези
5.00
рейтинг книги
Законы Рода. Том 11

Измена. (Не)любимая жена олигарха

Лаванда Марго
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Измена. (Не)любимая жена олигарха

Вираж бытия

Ланцов Михаил Алексеевич
1. Фрунзе
Фантастика:
героическая фантастика
попаданцы
альтернативная история
6.86
рейтинг книги
Вираж бытия

Отмороженный 11.0

Гарцевич Евгений Александрович
11. Отмороженный
Фантастика:
боевая фантастика
рпг
попаданцы
фантастика: прочее
фэнтези
5.00
рейтинг книги
Отмороженный 11.0

История "не"мощной графини

Зимина Юлия
1. Истории неунывающих попаданок
Фантастика:
попаданцы
фэнтези
5.00
рейтинг книги
История немощной графини

Крестоносец

Ланцов Михаил Алексеевич
7. Помещик
Фантастика:
героическая фантастика
попаданцы
альтернативная история
5.00
рейтинг книги
Крестоносец

Газлайтер. Том 15

Володин Григорий Григорьевич
15. История Телепата
Фантастика:
боевая фантастика
попаданцы
5.00
рейтинг книги
Газлайтер. Том 15

Призыватель нулевого ранга

Дубов Дмитрий
1. Эпоха Гардара
Фантастика:
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Призыватель нулевого ранга