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

46-49 Мы убеждаемся, что остается ровно два аргумента командной строки: имя узла получателя и название службы. Мы вызываем функцию host_servдля преобразования их в структуру адреса сокета, указатель на которую мы сохраняем в переменной dest.

Обработка локального имени и порта

50-74 Если в командной строке был указан соответствующий параметр, мы преобразуем имя локального узла и номер порта, сохраняя указатель на структуру адреса сокета под именем local. В противном случае для определения локального IP-адреса мы подключаемся через дейтаграммный сокет к нужному адресату и сохраняем полученный при этом локальный адрес под тем же именем local. Поскольку мы формируем собственные заголовки IP и UDP, мы должны знать IP-адрес отправителя при записи дейтаграммы UDP. Нельзя оставить адрес нулевым и предоставить уровню IP выбрать его самостоятельно, потому что адрес является частью псевдозаголовка UDP (о котором мы вскоре расскажем), используемого при вычислении контрольной суммы UDP.

Создаем символьный сокет и открываем устройство для захвата пакетов

75-76 Функция open_output  выбирает метод отправки пакетов (символьный сокет или libnet). Функция open_pcapоткрывает устройство захвата пакетов. Она будет рассмотрена далее.

Изменение прав и установка обработчиков сигналов

77-80 Для создания символьного сокета необходимо иметь права привилегированного пользователя. Обычно такие привилегии нужны нам для того, чтобы открыть устройство для захвата пакетов, но это зависит от реализации. Например, в случае BPF администратор может установить разрешения для устройств /dev/bpfлюбым способом в зависимости от того, что требуется для данной системы. Здесь мы не используем эти дополнительные разрешения, предполагая, что для файла программы установлен бит SUID. Процесс выполняется с правами привилегированного пользователя, а когда они становятся не нужны, при вызове функции setuid фактический идентификатор пользователя (real user ID), эффективный идентификатор пользователя (effective user ID) и сохраненный SUID принимают значение фактического идентификатора пользователя ( getuid). Мы устанавливаем обработчики сигналов на тот случай, если пользователь завершит программу раньше, чем будут изменены права.

Выполнение теста и очистка

81-82 Функция test_udp(см. листинг 29.6) выполняет тестирование и возвращает управление. Функция cleanup(см. листинг 29.14) выводит итоговую статистику библиотеки захвата пакетов, а затем завершает процесс.

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

Листинг 29.5. Функция open_pcap: открытие и инициализация устройства для захвата пакетов

//udpcksum/pcap.c

 1 #include "udpcksum.h"

 2 #define CMD "udp and src host %s and src port %d"

 3 void

 4 open_pcap(void)

 5 {

 6  uint32_t localnet, netmask;

 7  char cmd[MAXLINE], errbuf[PCAP_ERRBUF_SIZE], strl[INET_ADDRSTRLEN],

 8   str2[INET_ADDRSTRLEN];

 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)

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

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

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

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

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

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

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

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

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