Вход/Регистрация
UNIX: разработка сетевых приложений
вернуться

Стивенс Уильям Ричард

Шрифт:

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

Обработка ответов осуществляется функцией

readlоор
, представленной в листинге 28.4.

Листинг 28.4. Функция readloop

//ping/readlоор.c

1 #include "ping.h"

2 void

3 readloop(void)

4 {

5 int size;

6 char recvbuf[BUFSIZE];

7 char controlbuf[BUFSIZE];

8 struct msghdr msg;

9 struct iovec iov;

10 ssize_t n;

11 struct timeval tval;

12 sockfd = Socket(pr->sasend->sa_family, SOCK_RAW, pr->icmpproto);

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

больше не нужны */

14 if (pr->finit)

15 (*pr->finit);

16 size = 60 * 1024; /* setsockopt может завершиться с ошибкой */

17 setsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &size, sizeof(size));

18 sig_alrm(SIGALRM); /* отправка первого пакета */

19 iov.iov_base = recvbuf;

20 iov.iov_len = sizeof(recvbuf);

21 msg.msg_name = pr->sarecv;

22 msg.msg_iov = &iov;

23 msg.msg_iovlen = 1;

24 msg.msg_control = controlbuf;

25 for (;;) {

26 msg.msg_namelen = pr->salen;

27 msg.msg_controllen = sizeof(controlbuf);

28 n = recvmsg(sockfd, &msg, 0);

29 if (n < 0) {

  • Читать дальше
  • 1
  • ...
  • 388
  • 389
  • 390
  • 391
  • 392
  • 393
  • 394
  • 395
  • 396
  • 397
  • 398
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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