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

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

Жанры

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

48 dest = aip->ai_addr; /* не освобождаем память при помощи freeaddrinfo */

49 destlen = aip->ai_addrlen;

50 /*

51 * Нужен локальный IP-адрес для указания в UDP-дейтаграммах.

52 * Нельзя задать 0 и предоставить выбор уровню IP,

53 * потому что адрес нужен для вычисления контрольной суммы.

54 * Если указан параметр -1, используем заданные при вызове значения.

55 *
в противном случае соединяем сокет UDP с адресатом и определяем

56 * правильный адрес отправителя.

57 */

58 if (lopt) {

59 /* преобразование локального имени и сервиса */

60 aip = Host_serv(localname, localport, AF_INET, SOCK_DGRAM);

61 local = aip->ai_addr; /* не вызываем freeaddrinfo */

62 locallen = aip->ai_addrlen;

63 } else {

64 int s;

65 s = Socket(AF_INET, SOCK_DGRAM, 0);

66 Connect(s, dest, destlen);

67 /* ядро выбирает правильный локальный адрес */

68 locallen = sizeof(locallookup);

69 local = (struct sockaddr*)&locallookup;

70 Getsockname(s, local, &locallen);

71 if (locallookup.sin_addr.s_addr == htonl(INADDR_ANY))

72 err_quit("Can't determine local address - use -l\n");

73 close(s);

74 }

75 open_output; /* открываем поток вывода (символьный сокет или libnet) */

76 open_pcap; /* открываем устройство захвата пакетов */

77 setuid(getuid); /* права привилегированного пользователя больше

не нужны */

78 Signal(SIGTERM, cleanup);

79 Signal(SIGINT, cleanup);

80 Signal(SIGHUP, cleanup);

81 test_udp;

82 cleanup(0);

83 }

Обработка имени узла и порта получателя, затем локального имени узла и порта

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];

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

Помещица Бедная Лиза

Шах Ольга
Любовные романы:
любовно-фантастические романы
6.40
рейтинг книги
Помещица Бедная Лиза

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

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

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

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

Кровь на эполетах

Дроздов Анатолий Федорович
3. Штуцер и тесак
Фантастика:
альтернативная история
7.60
рейтинг книги
Кровь на эполетах

Убивать чтобы жить 3

Бор Жорж
3. УЧЖ
Фантастика:
героическая фантастика
боевая фантастика
рпг
5.00
рейтинг книги
Убивать чтобы жить 3

Тринадцатый V

NikL
5. Видящий смерть
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Тринадцатый V

Антимаг его величества. Том III

Петров Максим Николаевич
3. Модификант
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Антимаг его величества. Том III

Real-Rpg. Еретик

Жгулёв Пётр Николаевич
2. Real-Rpg
Фантастика:
фэнтези
8.19
рейтинг книги
Real-Rpg. Еретик

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

Кронос Александр
2. Меркурий
Фантастика:
фэнтези
5.00
рейтинг книги
Возвышение Меркурия. Книга 2

Прометей: повелитель стали

Рави Ивар
3. Прометей
Фантастика:
фэнтези
7.05
рейтинг книги
Прометей: повелитель стали

Бездомыш. Предземье

Рымин Андрей Олегович
3. К Вершине
Фантастика:
фэнтези
попаданцы
рпг
5.00
рейтинг книги
Бездомыш. Предземье

Законы Рода. Том 3

Flow Ascold
3. Граф Берестьев
Фантастика:
фэнтези
аниме
5.00
рейтинг книги
Законы Рода. Том 3

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

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

Я – Орк. Том 5

Лисицин Евгений
5. Я — Орк
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Я – Орк. Том 5