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

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

Жанры

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

Функция

main
приведена в листинге 28.3.

Листинг 28.3. Функция main

//ping/main.c

1 #include "ping.h"

2 struct proto proto_v4 =

3 { proc_v4, send_v4, NULL, NULL, NULL, 0, IPPROTO_ICMP };

4 #ifdef IPV6

5 struct proto proto_v6 =

6 { proc_v6, send_v6, init_v6, NULL, NULL, 0, IPPROTO_ICMPV6 };

7 #endif

8 int datalen = 56; /*
размер данных в эхо-запросе ICMP */

9 int

10 main(int argc, char **argv)

11 {

12 int c;

13 struct addrinfo *ai;

14 char *h;

15 opterr = 0; /* отключаем запись сообщений getopt в stderr */

16 while ((с = getopt(argc, argv, "v")) != -1) {

17 switch (c) {

18 case 'v':

19 verbose++;

20 break;

21 case '?':

22 err_quit("unrecognized option %c", c);

23 }

24 }

25 if (optind != argc-1)

26 err_quit("usage: ping [ -v ] <hostname>");

27 host = argv[optind];

28 pid = getpid & 0xffff; /* поле идентификатора ICMP имеет размер 16 бит */

29 Signal(SIGALRM, sig_alrm);

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

31 h = Sock_ntop_host(ai->ai_addr, ai->ai_addrlen);

32 printf("PING %s (%s): %d data bytes\n",

33 ai->ai_canonname ? ai->ai_canonname : h, h, datalen);

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

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

36 pr = &proto_v4;

37 #ifdef IPV6

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

39 pr = &proto_v6;

40 if (IN6_IS_ADDR_V4MAPPED(&(((struct sockaddr_in6*)

41 ai->ai_addr)->sin6_addr)))

42 err_quit("cannot ping IPv4-mapped IPv6 address");

43 #endif

44 } else

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

46 pr->sasend = ai->ai_addr;

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

48 pr->salen = ai->ai_addrlen;

49 readloop;

50 exit(0);

51 }

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

2-7
Определяется структура
proto
для IPv4 и IPv6. Указатели структуры адреса сокета инициализируются как нулевые, поскольку еще не известно, какая из версий будет использоваться — IPv4 или IPv6.

Длина дополнительных данных

8
Устанавливается количество дополнительных данных (56 байт), которые будут посылаться с эхо-запросом ICMP. При этом полная IPv4-дейтаграмма будет иметь размер 84 байта (20 байт на IPv4-заголовок и 8 байт на ICMP-заголовок), а IPv6-дейтаграмма будет иметь длину 104 байта. Все данные, посылаемые с эхо- запросом, должны быть возвращены в эхо-ответе. Время отправки эхо-запроса будет сохраняться в первых 8 байтах области данных, а затем, при получении эхо- ответа, будет использоваться для вычисления и вывода времени RTT.

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

15-24
Единственный параметр командной строки, поддерживаемый в нашей версии, это параметр
– v
, в результате использования которого большинство ICMP-сообщений будут выводиться на консоль. (Мы не выводим эхо-ответы, принадлежащие другой запущенной копии программы
ping
.) Для сигнала
SIGALRM
устанавливается обработчик, и мы увидим, что этот сигнал генерируется один раз в секунду и вызывает отправку эхо-запросов ICMP.

Обработка аргумента, содержащего имя узла

31-48
Строка, содержащая имя узла или IP-адрес, является обязательным аргументом и обрабатывается функцией
host_serv
. Возвращаемая структура
addrinfo
содержит семейство протоколов — либо
AF_INET
, либо
AF_INET6
. Глобальный указатель pr устанавливается на требуемую в конкретной ситуации структуру
proto
. Также с помощью вызова функции
IN6_IS_ADDR_V4MAPPED
мы убеждаемся, что адрес IPv6 на самом деле не является адресом IPv4, преобразованным к виду IPv6, поскольку даже если возвращаемый адрес является адресом IPv6, узлу будет отправлен пакет IPv4. (Если такая ситуация возникнет, можно переключиться и использовать IPv4.) Структура адреса сокета, уже размещенная в памяти с помощью функции
getaddrinfo
, используется для отправки, а другая структура адреса сокета того же размера размещается в памяти для получения.

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

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

Моури Эрли
3. Ваше Сиятельство
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Ваше Сиятельство 3

Сиротка 4

Первухин Андрей Евгеньевич
4. Сиротка
Фантастика:
фэнтези
попаданцы
6.00
рейтинг книги
Сиротка 4

Последний попаданец 5

Зубов Константин
5. Последний попаданец
Фантастика:
юмористическая фантастика
рпг
5.00
рейтинг книги
Последний попаданец 5

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

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

Мимик нового Мира 6

Северный Лис
5. Мимик!
Фантастика:
юмористическая фантастика
попаданцы
рпг
5.00
рейтинг книги
Мимик нового Мира 6

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

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

Шипучка для Сухого

Зайцева Мария
Любовные романы:
современные любовные романы
8.29
рейтинг книги
Шипучка для Сухого

Убийца

Бубела Олег Николаевич
3. Совсем не герой
Фантастика:
фэнтези
попаданцы
9.26
рейтинг книги
Убийца

Попытка возврата. Тетралогия

Конюшевский Владислав Николаевич
Попытка возврата
Фантастика:
альтернативная история
9.26
рейтинг книги
Попытка возврата. Тетралогия

Таблеточку, Ваше Темнейшество?

Алая Лира
Любовные романы:
любовно-фантастические романы
6.30
рейтинг книги
Таблеточку, Ваше Темнейшество?

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

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

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

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

Ученичество. Книга 1

Понарошку Евгений
1. Государственный маг
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Ученичество. Книга 1

Лапочки-дочки из прошлого. Исцели мое сердце

Лесневская Вероника
2. Суровые отцы
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Лапочки-дочки из прошлого. Исцели мое сердце