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

Данная программа состоит из двух частей: одна половина читает все, что приходит на символьный сокет, и выводит эхо-ответы ICMP, а другая половина один раз в секунду посылает эхо-запросы ICMP. Вторая половина запускается один раз в секунду сигналом SIGALRM.

В листинге 28.2 приведен заголовочный файл ping.h, подключаемый во всех файлах программы.

Листинг 28.2. Заголовочный файл ping.h

//ping/ping.h

 1 #include "unp.h"

 2 #include netinet/in_systm.h

 3 #include netinet/in.h

 4 #include netinet/ip_icmp.h

 5 #define BUFSIZE 1500

 6 /* глобальные переменные */

 7 char sendbuf[BUFSIZE];

 8 int datalen; /* размер данных после заголовка ICMP */

 9 char *host;

10 int nsent; /* увеличиваем на 1 для каждого sendto */

11 pid_t pid; /* наш PID */

12 int sockfd;

13 int verbose;

14 /* прототипы функций */

15 void init_v6(void);

16 void proc_v4(char*, ssize_t, struct msghdr*, struct timeval*);

17 void proc_v6(char*, ssize_t., struct msghdr*, struct timeval*);

18 void send_v4(void);

19 void send_v6(void):

20 void readloop(void);

21 void sig_alrm(int);

22 void tv_sub(struct timeval*, struct timeval*);

23 struct proto {

24  void (*fproc)(char*, ssize_t, struct msghdr*, struct timeval*);

25  void (*fsend)(void);

26  void (*finit)(void);

27  struct sockaddr *sasend; /* структура sockaddr{} для отправки,

                                полученная от getaddrinfo */

28  struct sockaddr *sarecv; /* sockaddr{} для получения */

29  socklen_t salen; /* длина sockaddr{} */

30  int icmpproto; /* значение IPPROTO_xxx для ICMP */

31 } *pr;

32 #ifdef IPV6

33 #include netinet/ip6.h

34 #include netinet/icmp6.h

35 #endif

Подключение заголовочных файлов IPv4 и ICMPv4

1-22 Подключаются основные заголовочные файлы IPv4 и ICMPv4, определяются некоторые глобальные переменные и прототипы функций.

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

23-31 Для обработки различий между IPv4 и IPv6 используется структура proto. Данная структура содержит два указателя на функции, два указателя на структуры адреса сокета, размер структуры адреса сокета и значение протокола для ICMP. Глобальный указатель prбудет указывать на одну из этих структур, которая будет инициализироваться для IPv4 или IPv6.

Подключение заголовочных файлов IPv6 и ICMPv6

32-35 Подключаются два заголовочных файла, определяющие структуры и константы IPv6 и ICMPv6 (RFC 3542 [114]).

Функция 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];

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

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

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

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

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

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

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

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

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