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

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

Жанры

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

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, файл <net/bpf.h> */

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, чтобы выяснить, обрабатываются ли эти дейтаграммы сервером иначе, чем дейтаграммы с контрольной суммой.

26
Параметр
– i
позволяет нам задать интерфейс, на котором будут приниматься ответы сервера. Если этот интерфейс не будет задан, библиотека для захвата пакетов выберет какой-либо интерфейс самостоятельно, но в случае узла с несколькими сетевыми интерфейсами этот выбор может оказаться некорректным. В этом заключается одно из различий между считыванием из обычного сокета и из устройства для захвата пакетов: в первом случае мы можем указать универсальный локальный адрес, что позволяет получать пакеты, прибывающие на любой из сетевых интерфейсов. Но во втором случае при работе с устройством для захвата пакетов мы можем получать пакеты, прибывающие только на конкретный интерфейс.

ПРИМЕЧАНИЕ

Можно отметить, что для пакетных сокетов Linux захват пакетов не ограничен одним устройством. Тем не менее библиотека libcap обеспечивает фильтрацию либо по умолчанию, либо согласно заданному нами параметру -i.

29-36
Параметр
– l
позволяет нам задать IP-адрес отправителя и номер порта. В качестве номера порта (или названия службы) берется строка, следующая за последней точкой, а IP-адресом является все, что расположено перед последней точкой.

Последняя часть функции

main
показана в листинге 29.4.

Листинг 29.4. Функция main: преобразование имен узлов и названий служб, создание сокета

//udpcksum/main.c

44 if (optind != argc-2)

45 usage("missing <host> and/or <serv>");

46 /* преобразование имени получателя и службы */

47 aip = Host_serv(argv[optind], argv[optind+1], AF_INET, SOCK_DGRAM);

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

Последний Паладин. Том 2

Саваровский Роман
2. Путь Паладина
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Последний Паладин. Том 2

Зубных дел мастер

Дроздов Анатолий Федорович
1. Зубных дел мастер
Фантастика:
научная фантастика
попаданцы
альтернативная история
5.00
рейтинг книги
Зубных дел мастер

Истребитель. Ас из будущего

Корчевский Юрий Григорьевич
Фантастика:
боевая фантастика
попаданцы
альтернативная история
5.25
рейтинг книги
Истребитель. Ас из будущего

Честное пионерское! Часть 3

Федин Андрей Анатольевич
3. Честное пионерское!
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Честное пионерское! Часть 3

Обгоняя время

Иванов Дмитрий
13. Девяностые
Фантастика:
попаданцы
5.00
рейтинг книги
Обгоняя время

Страж. Тетралогия

Пехов Алексей Юрьевич
Страж
Фантастика:
фэнтези
9.11
рейтинг книги
Страж. Тетралогия

Магия чистых душ

Шах Ольга
Любовные романы:
любовно-фантастические романы
5.40
рейтинг книги
Магия чистых душ

Имя нам Легион. Том 4

Дорничев Дмитрий
4. Меж двух миров
Фантастика:
боевая фантастика
рпг
аниме
5.00
рейтинг книги
Имя нам Легион. Том 4

Девятый

Каменистый Артем
1. Девятый
Фантастика:
боевая фантастика
попаданцы
9.15
рейтинг книги
Девятый

Морской волк. 1-я Трилогия

Савин Владислав
1. Морской волк
Фантастика:
альтернативная история
8.71
рейтинг книги
Морской волк. 1-я Трилогия

Отмороженный 8.0

Гарцевич Евгений Александрович
8. Отмороженный
Фантастика:
постапокалипсис
рпг
аниме
5.00
рейтинг книги
Отмороженный 8.0

Совершенный: охота

Vector
3. Совершенный
Фантастика:
боевая фантастика
рпг
5.00
рейтинг книги
Совершенный: охота

Калибр Личности 1

Голд Джон
1. Калибр Личности
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Калибр Личности 1

Личник

Валериев Игорь
3. Ермак
Фантастика:
альтернативная история
6.33
рейтинг книги
Личник