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

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

Жанры

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

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

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

Дамиров Рафаэль
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
рейтинг книги
Призыватель нулевого ранга