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

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

Жанры

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

9 struct bpf_program fcode;

10 if (device == NULL) {

11 if ((device = pcap_lookupdev(errbuf)) == NULL)

12 err_quit("pcap_lookup: %s", errbuf);

13 }

14 printf("device = %s\n", device);

15 /* жестко задано; promisc=0, to_ms=500 */

16 if ((pd = pcap_open_live(device, snaplen, 0, 500, errbuf)) == NULL)

17 err_quit("pcap_open_live: %s", errbuf);

18 if (pcap_lookupnet(device, &localnet, &netmask, errbuf) < 0)

19 err_quit("pcap_lookupnet %s", errbuf);

20 if (verbose)

21 printf("localnet = %s, netmask = %s\n",

22 Inet_ntop(AF_INET, &localnet, str1, sizeof(str1)),

23 Inet_ntop(AF_INET, &netmask. str2, sizeof(str2)));

24 snprintf(cmd, sizeof(cmd), CMD,

25 Sock_ntop_host(dest, destlen),

26 ntohs(sock_get_port(dest, destlen)));

27 if (verbose)

28 printf("cmd = %s\n", cmd);

29 if (pcap_compile(pd, &fcode, cmd, 0, netmask) < 0)

30 err_quit("pcap_compile: %s", pcap_geterr(pd));

31 if (pcap_setfilter(pd, &fcode) < 0)

32 err_quit("pcap_setfilter: %s", pcap_geterr(pd));

33 if ((datalink = pcap_datalink(pd)) < 0)

34 err_quit("pcap_datalink: %s", pcap_geterr(pd));

35 if (verbose)

36 printf("datalink = %d\n", datalink);

37 }

Выбор
устройства для захвата пакетов

10-14
Если устройство для захвата пакетов не было задано (с помощью параметра командной строки
– i
), то выбор этого устройства осуществляется с помощью функции
pcap_lookupdev
. С помощью запроса
SIOCGIFCONF
функции
ioctl
выбирается включенное устройство с минимальным порядковым номером, но только не устройство обратной связи. Многие из библиотечных функций
pcap
возвращают сообщения об ошибках в виде строк. Единственным аргументом функции
pcap_lookupdev
является массив, в который записывается строка с сообщением об ошибке.

Открываем устройство

15-17
Функция
pcap_open_live
открывает устройство. Слово
live
присутствует в названии функции потому, что здесь имеется в виду фактическое устройство для захвата пакетов, а не файл, содержащий предыдущие сохраненные пакеты. Первым аргументом функции является имя устройства, вторым — количество байтов, которое нужно сохранять для каждого пакета (значение
shaplen
,
которое мы инициализировали числом 200 в листинге 29.2), а третий аргумент — это флаг, указывающий на смешанный режим. Четвертый аргумент — это значение времени ожидания в миллисекундах, а пятый — указатель на массив, содержащий сообщения об ошибках.

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

tcpdump
. Тем не менее в нашем примере ответы сервера DNS будут посланы непосредственно на наш узел (то есть можно обойтись без смешанного режима).

Четвертый аргумент — время ожидания при считывании. Вместо того чтобы возвращать пакет процессу каждый раз, когда приходит очередной пакет (что может быть весьма неэффективно, так как в этом случае потребуется выполнять множество операций копирования отдельных пакетов из ядра в процесс), это делается, когда считывающий буфер устройства оказывается заполненным либо когда истекает время ожидания. Если время ожидания при считывании равно нулю, то каждый пакет будет переправляться процессу, как только будет получен.

Получение сетевого адреса и маски подсети

18-23
Функция
pcap_lookupnet
возвращает сетевой адрес и маску подсети для устройства захвата пакетов. При вызове функции
pcap_compile
, которая будет вызвана следующей, нужно задать маску подсети, поскольку с помощью маски фильтр пакетов определяет, является ли IP-адрес адресом широковещательной передачи для данной подсети.

Компиляция фильтра пакетов

24-30
Функция
pcap_compile
получает строку, построенную нами как массив
cmd
, и компилирует ее, создавая тем самым программу для фильтрации (записывая ее в
fcode
). Эта программа будет отбирать те пакеты, которые мы хотим получить.

Загрузка программы фильтрации

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

Определение типа канального уровня

33-36
Функция
pcap_datalink
возвращает тип канального уровня для устройства захвата пакетов. Эта информация нужна нам при захвате пакетов для того, чтобы определить размер заголовка канального уровня, который будет добавлен в начало каждого считываемого нами пакета (см. листинг 29.10).

После вызова функции

open_pcap
функция main вызывает функцию
test_udp
, показанную в листинге 29.6. Эта функция посылает запрос DNS и считывает ответ сервера.

Листинг 29.6. Функция test_udp: отправка запросов и считывание ответов

//udpcksum/udpcksum.c

12 void

13 test_udp(void)

14 {

15 volatile int nsent = 0, timeout = 3;

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

Свадьба по приказу, или Моя непокорная княжна

Чернованова Валерия Михайловна
Любовные романы:
любовно-фантастические романы
5.57
рейтинг книги
Свадьба по приказу, или Моя непокорная княжна

Сборник коротких эротических рассказов

Коллектив авторов
Любовные романы:
эро литература
love action
7.25
рейтинг книги
Сборник коротких эротических рассказов

Отец моего жениха

Салах Алайна
Любовные романы:
современные любовные романы
7.79
рейтинг книги
Отец моего жениха

Вадбольский

Никитин Юрий Александрович
1. Вадбольский
Фантастика:
попаданцы
5.00
рейтинг книги
Вадбольский

Бастард Императора. Том 7

Орлов Андрей Юрьевич
7. Бастард Императора
Фантастика:
городское фэнтези
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Бастард Императора. Том 7

Повелитель механического легиона. Том VIII

Лисицин Евгений
8. Повелитель механического легиона
Фантастика:
технофэнтези
аниме
фэнтези
5.00
рейтинг книги
Повелитель механического легиона. Том VIII

В зоне особого внимания

Иванов Дмитрий
12. Девяностые
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
В зоне особого внимания

Таня Гроттер и магический контрабас

Емец Дмитрий Александрович
1. Таня Гроттер
Фантастика:
фэнтези
8.52
рейтинг книги
Таня Гроттер и магический контрабас

Бастард Императора. Том 2

Орлов Андрей Юрьевич
2. Бастард Императора
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Бастард Императора. Том 2

Кодекс Крови. Книга ХI

Борзых М.
11. РОС: Кодекс Крови
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Кодекс Крови. Книга ХI

Третий

INDIGO
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
Третий

Возвышение Меркурия. Книга 16

Кронос Александр
16. Меркурий
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Возвышение Меркурия. Книга 16

Идеальный мир для Лекаря 9

Сапфир Олег
9. Лекарь
Фантастика:
боевая фантастика
юмористическое фэнтези
6.00
рейтинг книги
Идеальный мир для Лекаря 9

Потусторонний. Книга 1

Погуляй Юрий Александрович
1. Господин Артемьев
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Потусторонний. Книга 1