Читаем UNIX: разработка сетевых приложений полностью

35 Заканчиваем работу с UDP-сокетом клиента и закрываем его с помощью функции close. Дескриптор был переслан нам клиентом и, таким образом, является копией; следовательно, UDP-сокет все еще открыт на стороне клиента.

Обработка ошибок и завершение работы клиента

37-45 Если происходит ошибка, клиент получает нулевой байт. Когда клиент завершается, наша часть доменного сокета Unix закрывается, и соответствующий дескриптор удаляется из набора дескрипторов для функции select. Полю connfdструктуры clientприсваивается значение -1, что является указанием на ее освобождение.

Функция readable_v4вызывается, когда символьный сокет ICMPv4 открыт для чтения. Первая часть данной функции приведена в листинге 28.29. Этот код аналогичен коду для ICMPv4, приведенному ранее в листингах 28.6 и 28.15.

Листинг 28.29. Обработка полученных дейтаграмм ICMPv4, первая часть

//icmpd/readable_v4.c

 1 #include "icmpd.h"

 2 #include netinet/in_systm.h

 3 #include netinet/ip.h

 4 #include netinet/ip_icmp.h

 5 #include netinet/udp.h

 6 int

 7 readable_v4(void)

 8 {

 9  int i, hlen1, hlen2, icmplen, sport;

10  char buf[MAXLINE];

11  char srcstr[INET_ADDRSTRLEN], dststr[INET_ADDRSTRLEN];

12  ssize_t n;

13  socklen_t len;

14  struct ip *ip, *hip;

15  struct icmp *icmp;

16  struct udphdr *udp;

17  struct sockaddr_in from, dest;

18  struct icmpd_err icmpd_err;

19  len = sizeof(from);

20  n = Recvfrom(fd4, buf, MAXLINE, 0, (SA*)from, len);

21  printf("%d bytes ICMPv4 from %s:", n, Sock_ntop_host((SA*)from, len));

22  ip = (struct ip*)buf; /* начало IP-заголовка */

23  hlen1 = ip-ip_hl 2; /* длина IP-заголовка */

24  icmp = (struct icmp*)(buf + hlen1); /* начало ICMP-заголовка */

25  if ((icmplen = n - hlen1) 8)

26   err_quit("icmplen (%d) 8", icmplen);

27  printf(" type = %d, code = %d\n", icmp-icmp_type, icmp-icmp_code);

Функция выводит некоторую информацию о каждом получаемом сообщении ICMP. Это было сделано для отладки при разработке демона, и вывод управляется аргументом командной строки.

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

Листинг 28.30. Обработка полученных дейтаграмм ICMPv4, вторая часть

//icmpd/readable_v4.c

28  if (icmp-icmp_type == ICMP_UNREACH ||

29   icmp-icmp_type ==ICMP_TIMXCEED ||

30   icmp-icmp_type == ICMP_SOURCEQUENCH) {

31   if (icmplen 8 + 20 + 8)

32    err_quit("icmplen (%d) 8 + 20 + 8, icmplen);

33   hip = (struct ip*)(buf + hlen1 + 8);

34   hlen2 = hip-ip_hl 2;

35   printf("\tsrcip = %s, dstip = %s, proto = %d\n",

36    Inet_ntop(AF_INET, hip-ip_src, srcstr, sizeof(srcstr)),

37    Inet_ntop(AF_INET, hip-ip_dst, dststr, sizeof(dststr)),

38    hip-ip_p);

39   if (hip-ip_p == IPPROTO_UDP) {

40    udp = (struct udphdr*)(buf + hlen1 + 8 + hlen2);

41    sport = udp-uh_sport;

42    /* поиск доменного сокета клиента, отправка заголовка */

43    for (i = 0; i = maxi; i++) {

44     if (client[i].connfd = 0

45      client[i].family == AF_INET

46      client[i].lport == sport) {

47      bzero(dest, sizeof(dest));

48      dest.sin_family = AF_INET;

49 #ifdef HAVE_SOCKADDR_SA_LEN

50      dest.sin_len = sizeof(dest);

51 #endif

Перейти на страницу:

Похожие книги

Основы программирования в Linux
Основы программирования в Linux

В четвертом издании популярного руководства даны основы программирования в операционной системе Linux. Рассмотрены: использование библиотек C/C++ и стан­дартных средств разработки, организация системных вызовов, файловый ввод/вывод, взаимодействие процессов, программирование средствами командной оболочки, создание графических пользовательских интерфейсов с помощью инструментальных средств GTK+ или Qt, применение сокетов и др. Описана компиляция программ, их компоновка c библиотеками и работа с терминальным вводом/выводом. Даны приемы написания приложений в средах GNOME® и KDE®, хранения данных с использованием СУБД MySQL® и отладки программ. Книга хорошо структурирована, что делает обучение легким и быстрым. Для начинающих Linux-программистов

Нейл Мэтью , Ричард Стоунс , Татьяна Коротяева

ОС и Сети / Программирование / Книги по IT
1001 совет по обустройству компьютера
1001 совет по обустройству компьютера

В книге собраны и обобщены советы по решению различных проблем, которые рано или поздно возникают при эксплуатации как экономичных нетбуков, так и современных настольных моделей. Все приведенные рецепты опробованы на практике и разбиты по темам: аппаратные средства персональных компьютеров, компьютерные сети и подключение к Интернету, установка, настройка и ремонт ОС Windows, работа в Интернете, защита от вирусов. Рассмотрены не только готовые решения внезапно возникающих проблем, но и ответы на многие вопросы, которые возникают еще до покупки компьютера. Приведен необходимый минимум технических сведений, позволяющий принять осознанное решение.Компакт-диск прилагается только к печатному изданию книги.

Юрий Всеволодович Ревич

Программирование, программы, базы данных / Интернет / Компьютерное «железо» / ОС и Сети / Программное обеспечение / Книги по IT