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

 3 #include /* необходим для ip.h */

 4 #include

 5 #include

 6 #include

 7 #include

 8 #include

 9 #include

10 #include

11 #define TTL_OUT 64 /* исходящее TTL */

12 /* объявление глобальных переменных */

13 extern struct sockaddr *dest, *local;

14 extern socklen_t destlen, locallen;

15 extern int datalink;

16 extern char *device;

17 extern pcap_t *pd;

18 extern int rawfd;

19 extern int snaplen;

20 extern int verbose;

21 extern int zerosum;

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

23 void cleanup(int);

24 char *next_pcap(int*);

25 void open_output(void);

26 void open_pcap(void);

27 void send_dns_query(void);

28 void test_udp(void);

29 void udp_write(char*, int);

30 struct udpiphdr *udp_read(void);

3-10 Для работы с полями заголовков IP и UDP требуются дополнительные заголовочные файлы Интернета.

11-30 Мы определяем некоторые глобальные переменные и прототипы для своих собственных функций, которые вскоре покажем.

Первая часть функции main показана в листинге 29.2.

Листинг 29.2. Функция main: определения

//udpcksum/main.c

 1 #include "udpcksum.h"

 2 /* определение глобальных переменных */

 3 struct sockaddr *dest, *local;

 4 struct sockaddr_in locallookup;

 5 socklen_t destlen, locallen;

 6 int datalink; /* из pcap_datalink(), файл */

 7 char *device; /* устройство pcap */

 8 pcap_t *pd; /* указатель на структуру захваченных пакетов */

 9 int rawfd; /* символьный сокет */

10 int snaplen = 200; /* объем захваченных данных */

11 int verbose;

12 int zerosum; /* отправка UDP-запроса без контрольной суммы */

13 static void usage(const char*);

14 int

15 main(int argc, char *argv[])

16 {

17  int c, lopt=0;

18  char *ptr, localname[1024], *localport;

19  struct addrinfo *aip;

В следующей части функции main, представленной в листинге 29.3, обрабатываются аргументы командной строки.

Листинг 29.3. Функция main: обработка аргументов командной строки

//udpcksum/main.c

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

21  while ((с = getopt(argc, argv, "0i:l:v")) != -1) {

22   switch (с) {

23   case '0':

24    zerosum = 1;

25    break;

26   case 'i';

27    device = optarg; /* устройство pcap */

28    break;

29   case 'l'; /* локальный IP адрес и номер порта; a.b.c.d.p */

30    if ((ptr = strrchr(optarg, '.')) == NULL)

31     usage("invalid -l option");

32    *ptr++ = 0; /* нуль заменяет последнюю точку. */

33    local port = ptr; /* имя сервиса или номер порта */

34    strncpy(localname, optarg, sizeof(localname));

35    lopt = 1;

36    break;

37   case 'v':

38    verbose = 1;

39    break;

40   case '?':

41    usage("unrecognized option");

42   }

43  }

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

20-25 Мы вызываем функцию getopt для обработки аргументов командной строки. С помощью параметра -0 мы посылаем запросы UDP без контрольной суммы UDP, чтобы выяснить, обрабатываются ли эти дейтаграммы сервером иначе, чем дейтаграммы с контрольной суммой.

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

Все книги серии Мастер-класс

Секреты резьбы по дереву
Секреты резьбы по дереву

Изделия из древесины и материалов, имитирующих ее текстуру, привычным образом окружают нас в повседневной жизни, поэтому мы относимся к ней как к чему-то обыденному. Но как только ее коснется умелая рука мастера резьбы по дереву, рождается произведение искусства и раскрываются такие качества древесины, как богатая фактура, разнообразие цветов, особая теплота. Эта книга поможет читателю открыть для себя удивительный мир творчества и познать секреты резьбы по дереву. Автор надеется, что начинающие резчики найдут в ней интересный и полезный материал, который позволит им стать мастерами. В приложении представлены рисунки орнаментов и различных узоров, которые на первых порах можно копировать, а по мере приобретения навыка на их основе разрабатывать свои образцы.

Галина Алексеевна Серикова

Сделай сам / Хобби и ремесла / Руководства / Дом и досуг / Словари и Энциклопедии

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