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

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

Жанры

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

25 Bind(sendfd, pr->sabind, pr->salen);

26 sig_alrm(SIGALRM);

27 seq = 0;

28 done = 0;

29 for (ttl = 1; ttl <= max_ttl && done == 0; ttl++) {

30 Setsockopt(sendfd, pr->ttllevel, pr->ttloptname, &ttl, sizeof(int));

31 bzero(pr->salast, pr->salen);

32 printf("%2d ", ttl);

33 fflush(stdout);

34 for (probe = 0; probe < nprobes; probe++) {

35 rec = (struct rec*)sendbuf;

36 rec->rec_seq = ++seq;

37 rec->rec_ttl = ttl;

38 Gettimeofday(&rec->rec_tv, NULL);

39 sock_set_port(pr->sasend, pr->salen, htons(dport + seq));

40 Sendto(sendfd, sendbuf, datalen, 0, pr->sasend, pr->salen);

41 if ((code = (*pr->recv)(seq, &tvrecv)) == -3)

42 printf(" *"); /*
тайм-аут, ответа нет */

43 else {

44 char str[NI_MAXHOST];

45 if (sock_cmp_addr(pr->sarecv, pr->salast, pr->salen) != 0) {

46 if (getnameinfo(pr->sarecv, pr->salen, str, sizeof(str),

47 NULL, 0, 0) == 0)

48 printf(" %s (%s)", str,

49 Sock_ntop_host(pr->sarecv, pr->salen));

50 else

51 printf(" %s", Sock_ntop_host(pr->sarecv, pr->salen));

52 memcpy(pr->salast, pr->sarecv, pr->salen);

53 }

54 tv_sub(&tvrecv, &rec->rec_tv);

55 rtt = tvrecv.tv_sec * 1000.0 + tvrecv.tv_usec / 1000.0;

56 printf(" %.3f ms", rtt);

57 if (code == -1) /* порт получателя недоступен */

58 done++;

59 else if (code >= 0)

60 printf(" (ICMP %s)", (*pr->icmpcode)(code));

61 }

62 fflush(stdout);

63 }

64 printf("\n");

65 }

66 }

Создание двух сокетов

9-10
Нам необходимо два сокета: символьный сокет, на котором мы читаем все вернувшиеся ICMP-сообщения,
и UDP-сокет, на который мы посылаем пробные пакеты с увеличивающимся значением поля TTL. После создания символьного сокета мы заменяем наш эффективный идентификатор пользователя на фактический, поскольку более нам не понадобятся права привилегированного пользователя.

Установка фильтра ICMPv6

11-20
Если мы отслеживаем маршрут к адресату IPv6 и параметр командной строки -V указан не был, можно установить фильтр, который будет блокировать все ICMP-сообщения, за исключением тех, которые нас интересуют: «Time exceeded» и «Destination unreachable». Это сократит число пакетов, получаемых на данном сокете.

Связывание порта отправителя UDP-сокета

21-25
Осуществляется связывание порта отправителя с UDP-сокетом, который используется для отправки пакетов. При этом берется 16 младших битов из идентификатора нашего процесса, а старшему биту присваивается 1. Поскольку несколько копий программы
traceroute
могут работать одновременно, нам необходима возможность определить, относится ли поступившее ICMP-сообщение к одной из наших дейтаграмм или оно пришло в ответ на дейтаграмму, посланную другой копией программы. Мы используем порт отправителя в UDP-заголовке для определения отправляющего процесса, поскольку возвращаемое ICMP-сообщение всегда содержит UDP-заголовок дейтаграммы, вызвавшей ICMP-ошибку.

Установка обработчика сигнала SIGALRM

26
Мы устанавливаем нашу функцию
sig_alrm
в качестве обработчика сигнала
SIGALRM
, поскольку каждый раз, когда мы посылаем UDP-дейтаграмму, мы ждем 3 с, прежде чем послать следующий пробный пакет.

Основной цикл: установка TTL или предельного количества транзитных узлов и отправка трех пробных пакетов

27-38
Основным циклом функции является двойной вложенный цикл
for
. Внешний цикл стартует со значения TTL или предельного количества транзитных узлов, равного 1, и увеличивает это значение на 1, в то время как внутренний цикл посылает три пробных пакета (UDP-дейтаграммы) получателю. Каждый раз, когда изменяется значение TTL, мы вызываем
setsockopt
для установки нового значения, используя параметр сокета
IP_TTL
или
IPV6_UNICAST_HOPS
.

Каждый раз во внешнем цикле мы инициализируем нулем структуру адреса сокета, на которую указывает

salast
. Данная структура будет сравниваться со структурой адреса сокета, возвращенной функцией
recvfrom
, при считывании ICMP-сообщения, и если эти две структуры будут различны, на экран будет выведен IP-адрес из новой структуры. При использовании этого метода для каждого значения TTL выводится IP-адрес, соответствующий первому пробному пакету, а если для данного значения TTL IP-адрес изменится (то есть во время работы программы изменится маршрут), то будет выведен новый IP-адрес.

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

Сама себе хозяйка

Красовская Марианна
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Сама себе хозяйка

Сердце Дракона. Том 11

Клеванский Кирилл Сергеевич
11. Сердце дракона
Фантастика:
фэнтези
героическая фантастика
боевая фантастика
6.50
рейтинг книги
Сердце Дракона. Том 11

Первый среди равных. Книга IV

Бор Жорж
4. Первый среди Равных
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Первый среди равных. Книга IV

Неучтенный. Дилогия

Муравьёв Константин Николаевич
Неучтенный
Фантастика:
боевая фантастика
попаданцы
7.98
рейтинг книги
Неучтенный. Дилогия

Мастер Разума IV

Кронос Александр
4. Мастер Разума
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Мастер Разума IV

Авиатор: назад в СССР

Дорин Михаил
1. Авиатор
Фантастика:
попаданцы
альтернативная история
5.25
рейтинг книги
Авиатор: назад в СССР

Кадры решают все

Злотников Роман Валерьевич
2. Элита элит
Фантастика:
боевая фантастика
попаданцы
альтернативная история
8.09
рейтинг книги
Кадры решают все

Плеяда

Суконкин Алексей
Проза:
военная проза
русская классическая проза
5.00
рейтинг книги
Плеяда

Потусторонний. Книга 2

Погуляй Юрий Александрович
2. Господин Артемьев
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Потусторонний. Книга 2

Ученик. Книга 4

Первухин Андрей Евгеньевич
4. Ученик
Фантастика:
фэнтези
5.67
рейтинг книги
Ученик. Книга 4

Законник Российской Империи. Том 3

Ткачев Андрей Юрьевич
3. Словом и делом
Фантастика:
городское фэнтези
альтернативная история
аниме
дорама
5.00
рейтинг книги
Законник Российской Империи. Том 3

Ваше Сиятельство 7

Моури Эрли
7. Ваше Сиятельство
Фантастика:
боевая фантастика
аниме
5.00
рейтинг книги
Ваше Сиятельство 7

Война

Валериев Игорь
7. Ермак
Фантастика:
боевая фантастика
альтернативная история
5.25
рейтинг книги
Война

Младший сын князя. Том 4

Ткачев Андрей Юрьевич
4. Аналитик
Фантастика:
фэнтези
аниме
5.00
рейтинг книги
Младший сын князя. Том 4