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

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

Жанры

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

36 pid = getpid;

37 Signal(SIGALRM, sig_alrm);

38 ai = Host_serv(host, NULL, 0, 0);

39 printf("traceroute to %s (%s): %d hops max, %d data bytes\n",

40 ai->ai_canonname,

41 Sock_ntop_host(ai->ai_addr, ai->ai_addrlen);

42 max_ttl, datalen);

43 /*
инициализация в зависимости от протокола */

44 if (ai->ai_family == AF_INET) {

45 pr = &proto_v4;

46 #ifdef IPV6

47 } else if (ai->ai_family == AF_INET6) {

48 pr = &proto_v6;

49 if (IN6_IS_ADDR_V4MAPPED

50 (&(((struct sockaddr_in6*)ai->ai_addr)->sin6_addr)))

51 err_quit("cannot traceroute IPv4-mapped IPv6 address");

52 #endif

53 } else

54 err_quit("unknown address family %d", ai->ai_family);

55 pr->sasend = ai->ai_addr; /* содержит адрес получателя */

56 pr->sarecv = Calloc(1, ai->ai_addrlen);

57 pr->salast = Calloc(1, ai->ai_addrlen);

58 pr->sabind = Calloc(1, ai->ai_addrlen);

59 pr->salen = ai->ai_addrlen;

60 traceloop;

61 exit(0);

62 }

Определение структуры proto

2-9
Определяются две структуры
proto
, одна для IPv4 и другая для IPv6, хотя указатели на структуры адреса сокета не размещаются в памяти до окончания выполнения данной функции.

Установка значений по умолчанию

10-13
Максимальное значение поля TTL или поля предельного количества транзитных узлов, используемое в программе, по умолчанию равно 30. Предусмотрен параметр командной строки
– m
, чтобы пользователь мог поменять это значение. Для каждого значения TTL посылается три пробных пакета, но их количество также может быть изменено с помощью параметра командной строки. Изначально используется номер порта получателя 32 768 + 666, и каждый раз, когда посылается новая дейтаграмма UDP, это значение увеличивается на 1. Мы можем надеяться, что порты с такими номерами не используются на узле получателя в тот момент, когда приходит дейтаграмма, однако гарантии здесь нет.

Обработка аргументов командной строки

19-37
Параметр командной строки -v позволяет вывести все остальные ICMP-сообщения.

Обработка имени узла или IP-адреса и завершение инициализации

38-58
Имя узла получателя или IP-адрес обрабатывается функцией
host_serv
, возвращающей указатель на структуру
addrinfo
. В зависимости от типа возвращенного адреса (IPv4 или IPv6) заканчивается инициализация структуры
proto
, сохраняется указатель в глобальной переменной pr, а также размещается в памяти дополнительная структура адреса сокета соответствующего размера.

Функция

traceloop
, приведенная в листинге 28.15, отправляет дейтаграммы и читает вернувшиеся ICMP-сообщения. Это основной цикл программы.

Листинг 28.15. Функция traceloop: основной цикл обработки

//traceroute/traceloop.c

1 #include "trace.h"

2 void

3 traceloop(void)

4 {

5 int seq, code, done;

6 double rtt;

7 struct rec *rec;

8 struct timeval tvrecv;

9 recvfd = Socket(pr->sasend->sa_family, SOCK_RAW, pr->icmpproto);

10 setuid(getuid); /* права привилегированного пользователя больше

не нужны */

11 #ifdef IPV6

12 if (pr->sasend->sa_family == AF_INET6 && verbose == 0) {

13 struct icmp6_filter myfilt;

14 ICMP6_FILTER_SETBLOCKALL(&myfilt);

15 ICMP6_FILTER_SETPASS(ICMP6_TIME_EXCEEDED, &myfilt);

16 ICMP6_FILTER_SETPASS(ICMP6_DST_UNREACH, &myfilt);

17 setsockopt(recvfd, IPPROTO_IPV6, ICMP6_FILTER,

18 &myfilt, sizeof(myfilt));

19 }

20 #endif

21 sendfd = Socket(pr->sasend->sa_family, SOCK_DGRAM, 0);

22 pr->sabind->sa_family = pr->sasend->sa_family;

23 sport = (getpid & 0xffff) | 0x8000; /* UDP-порт отправителя # */

24 sock_set_port(pr->sabind, pr->salen, htons(sport));

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

Школа. Первый пояс

Игнатов Михаил Павлович
2. Путь
Фантастика:
фэнтези
7.67
рейтинг книги
Школа. Первый пояс

Лейб-хирург

Дроздов Анатолий Федорович
2. Зауряд-врач
Фантастика:
альтернативная история
7.34
рейтинг книги
Лейб-хирург

Не грози Дубровскому! Том VIII

Панарин Антон
8. РОС: Не грози Дубровскому!
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Не грози Дубровскому! Том VIII

Вернуть невесту. Ловушка для попаданки

Ардова Алиса
1. Вернуть невесту
Любовные романы:
любовно-фантастические романы
8.49
рейтинг книги
Вернуть невесту. Ловушка для попаданки

Идеальный мир для Лекаря

Сапфир Олег
1. Лекарь
Фантастика:
фэнтези
юмористическое фэнтези
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря

Последний Паладин. Том 4

Саваровский Роман
4. Путь Паладина
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Последний Паладин. Том 4

Титан империи 7

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

На руинах Мальрока

Каменистый Артем
2. Девятый
Фантастика:
боевая фантастика
9.02
рейтинг книги
На руинах Мальрока

Сопряжение 9

Астахов Евгений Евгеньевич
9. Сопряжение
Фантастика:
боевая фантастика
постапокалипсис
технофэнтези
рпг
5.00
рейтинг книги
Сопряжение 9

Здравствуй, 1985-й

Иванов Дмитрий
2. Девяностые
Фантастика:
альтернативная история
5.25
рейтинг книги
Здравствуй, 1985-й

Генерал-адмирал. Тетралогия

Злотников Роман Валерьевич
Генерал-адмирал
Фантастика:
альтернативная история
8.71
рейтинг книги
Генерал-адмирал. Тетралогия

Машенька и опер Медведев

Рам Янка
1. Накосячившие опера
Любовные романы:
современные любовные романы
6.40
рейтинг книги
Машенька и опер Медведев

Беглец. Второй пояс

Игнатов Михаил Павлович
8. Путь
Фантастика:
фэнтези
героическая фантастика
боевая фантастика
5.67
рейтинг книги
Беглец. Второй пояс

Защитник. Второй пояс

Игнатов Михаил Павлович
10. Путь
Фантастика:
фэнтези
5.25
рейтинг книги
Защитник. Второй пояс