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

 4 IPPROTO_ICMP, IPPROTO_IP, IP_TTL};

 5 #ifdef IPV6

 6 struct proto proto_v6 =

 7  {icmpcode_v6, recv_v6, NULL, NULL, NULL, NULL, 0,

 8 IPPROTO_ICMPV6, IPPROTO_IPV6, IPV6_UNICAST_HOPS};

 9 #endif

10 int datalen = sizeof(struct rec); /* значения по умолчанию */

11 int max_ttl = 30;

12 int nprobes = 3;

13 u_short dport = 32768 + 666;

14 int

15 main(int argc, char **argv)

16 {

17  int c;

18  struct addrinfo *ai;

19  opterr = 0; /* чтобы функция getopt не записывала в stderr */

20  while ((с = getopt(argc, argv, "m:v")) != -1) {

21   switch (c) {

22   case 'm':

23    if ((max_ttl = atoi(optarg)) = 1)

24     err_quit("invalid -m value");

25    break;

26   case 'v':

27    verbose++;

28    break;

29   case '?':

30    err_quit("unrecognized option: %c", c);

31   }

32  }

33  if (optind != argc - 1)

34   err_quit("usage: traceroute [ -m maxttl -v ] hostname");

35  host = argv[optind];

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, а также размещается в памяти дополнительная структура адреса сокета соответствующего размера.

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

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

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

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

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

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

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

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

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