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

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

Жанры

UNIX: разработка сетевых приложений
Шрифт:

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

52 memcpy(&dest.sin_addr, &hip->ip_dst,

53 sizeof(struct in_addr));

54 dest.sin_port = udp->uh_dport;

55 icmpd_err.icmpd_type = icmp->icmp_type;

56 icmpd_err.icmpd_code = icmp->icmp_code;

57 icmpd_err.icmpd_len = sizeof(struct sockaddr_in);

58 memcpy(&icmpd_err.icmpd_dest, &dest, sizeof(dest));

59 /*
преобразование кода и типа ICMP в значение errno */

60 icmpd_err.icmpd_errno = EHOSTUNREACH; /* по умолчанию */

61 if (icmp->icmp_type == ICMP_UNREACH) {

62 if (icmp->icmp_code == ICMP_UNREACH_PORT)

63 icmpd_err.icmpd_errno = ECONNREFUSED;

64 else if (icmp->icmp_code == ICMP_UNREACH_NEEDFRAG)

65 icmpd_err.icmpd_errno = EMSGSIZE;

66 }

67 Write(client[i].connfd, &icmpd_err, sizeof(icmpd_err));

68 }

69 }

70 }

71 }

72 return(--nready);

73 }

Проверка типа сообщения, уведомление приложения

29-31
ICMP-сообщения, которые посылаются приложениям, — это сообщения о недоступности порта, превышении времени и завершении клиента (см. табл. 28.1).

Проверка ошибки UDP, поиск клиента

34-42
Указатель
hip
указывает на IP-заголовок, который возвращается сразу после заголовка ICMP. Это IP-заголовок дейтаграммы, вызвавшей ICMP-ошибку. Мы убеждаемся, что эта IP-дейтаграмма является UDP-дейтаграммой, а затем извлекаем номер UDP-порта из UDP-заголовка, следующего за IP-заголовком.

43-55
По всем структурам
client
осуществляется
поиск подходящего семейства адресов и порта. Если соответствие найдено, строится структура адреса сокета IPv4, которая содержит IP-адрес получателя и порт из UDP-дейтаграммы, вызвавшей ошибку.

Построение структуры icmpd_err

56-70
Строится структура
icmpd_err
, посылаемая клиенту через доменный сокет Unix. Тип и код сообщения ICMP сначала отображаются в значение
errno
, как показано в табл. 28.1.

Ошибки ICMPv6 обрабатываются функцией

readable_v6
, первая часть которой приведена в листинге 28.31. Обработка ошибок ICMPv6 аналогична коду, приведенному в листингах 28.7 и 28.16.

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

//icmpd/readable_v6.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 #ifdef IPV6

7 #include <netinet/ip6.h>

8 #include <netinet/icmp6.h>

9 #endif

10 int

11 readable_v6(void)

12 {

13 #ifdef IPV6

14 int i, hlen2, icmp6len, sport;

15 char buf[MAXLINE];

16 char srcstr[INET6_ADDRSTRLEN], dststr[INET6_ADDRSTRLEN];

17 ssize_t n;

18 socklen_t len;

19 struct ip6_hdr *ip6, *hip6;

20 struct icmp6_hdr *icmp6;

21 struct udphdr *udp;

22 struct sockaddr_in6 from, dest;

23 struct icmpd_err icmpd_err;

24 len = sizeof(from);

25 n = Recvfrom(fd6, buf, MAXLINE, 0, (SA*)&from, &len);

26 printf("%d bytes ICMPv6 from %s:", n, Sock_ntop_host((SA*)&from, len));

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

Леди Малиновой пустоши

Шах Ольга
Любовные романы:
любовно-фантастические романы
6.20
рейтинг книги
Леди Малиновой пустоши

Пропала, или Как влюбить в себя жену

Юнина Наталья
2. Исцели меня
Любовные романы:
современные любовные романы
6.70
рейтинг книги
Пропала, или Как влюбить в себя жену

Сердце Дракона. нейросеть в мире боевых искусств (главы 1-650)

Клеванский Кирилл Сергеевич
Фантастика:
фэнтези
героическая фантастика
боевая фантастика
7.51
рейтинг книги
Сердце Дракона. нейросеть в мире боевых искусств (главы 1-650)

Измена. Право на сына

Арская Арина
4. Измены
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Измена. Право на сына

Всплеск в тишине

Распопов Дмитрий Викторович
5. Венецианский купец
Фантастика:
попаданцы
альтернативная история
5.33
рейтинг книги
Всплеск в тишине

Я — Легион

Злобин Михаил
3. О чем молчат могилы
Фантастика:
боевая фантастика
7.88
рейтинг книги
Я — Легион

Долг

Кораблев Родион
7. Другая сторона
Фантастика:
боевая фантастика
5.56
рейтинг книги
Долг

И только смерть разлучит нас

Зика Натаэль
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
И только смерть разлучит нас

Лорд Системы 4

Токсик Саша
4. Лорд Системы
Фантастика:
фэнтези
попаданцы
рпг
5.00
рейтинг книги
Лорд Системы 4

Камень. Книга восьмая

Минин Станислав
8. Камень
Фантастика:
фэнтези
боевая фантастика
7.00
рейтинг книги
Камень. Книга восьмая

Гарем вне закона 18+

Тесленок Кирилл Геннадьевич
1. Гарем вне закона
Фантастика:
фэнтези
юмористическая фантастика
6.73
рейтинг книги
Гарем вне закона 18+

Возвращение Низвергнутого

Михайлов Дем Алексеевич
5. Изгой
Фантастика:
фэнтези
9.40
рейтинг книги
Возвращение Низвергнутого

Неудержимый. Книга XI

Боярский Андрей
11. Неудержимый
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Неудержимый. Книга XI

Месть за измену

Кофф Натализа
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Месть за измену