UNIX: разработка сетевых приложений
Шрифт:
14 if (l == NULL) {
15 err_quit("Can't initialize libnet: %s", errbuf);
16 }
17 }
Объявление дескриптора libnet
7
В библиотеке libnet
используется непрозрачный тип libnet_t
. Функция libnet_init
возвращает указатель на этот тип, который затем передается другим функциям libnet
для
pcap
. Инициализация libnet
12-16
Мы вызываем функцию libnet_init
, запрашивая открытие символьного сокета IPv4. Для этого в качестве первого аргумента указывается константа LIBNET_RAW4
. В случае возникновения ошибки функция возвращает текст сообщения в аргументе errbuf
, который мы распечатываем. Функция
send_dns_query
для libnet
представлена в листинге 29.16. Сравните ее с функциями send_dns_query
и udp_write
для символьных сокетов. Листинг 29.16. Функция send_dns_query, использующая libnet
//udpcksum/senddnsquery-libnet.c
18 void
19 send_dns_query(void)
20 {
21 char qbuf[24], *ptr;
22 u_int16_t one;
23 int packet_size = LIBNET_UDP_H + LIBNET_DNSV4_H + 24;
24 static libnet_ptag_t ip_tag, udp_tag, dns_tag;
25 /* построение запроса внутри UDP-пакета */
26 ptr = qbuf;
27 memcpy(ptr, "\001a\014root-servers\003net\000", 20);
28 ptr += 20;
29 one = htons(1);
30 memcpy(ptr, &one, 2); /* тип запроса = A */
31 ptr += 2;
32 memcpy(ptr, &one, 2); /* класс запроса = 1 (IP-адрес) */
33 /* формирование пакета DNS */
34 dns_tag = libnet_build_dnsv4(
35 1234 /* идентификатор */,
36 0x0100 /* флаги: рекурсия разрешена */,
37 1 /* кол-во запросов */, 0 /* кол-во записей в ответе */,
38 0 /* кол-во авторитетных записей */, 0 /* кол-во дополнительных */,
39 qbuf /* запрос */,
40 24 /*
длина запроса */, 1, dns_tag);
41 /* формирование заголовка UDP */
42 udp_tag = libnet_build_udp(
43 ((struct sockaddr_in*)local)->
44 sin_port /* порт отправителя */,
45 ((struct sockaddr_in*)dest)->
46 sin_port /* порт получателя */,
47 packet_size /* длина */, 0 /* контрольная сумма */,
48 NULL /* полезные данные */, 0 /* длина полезн. данных */, l, udp_tag);
49 /* Так как мы установили контр. сумму равной нулю, libnet автоматически */
50 /* рассчитает контр. сумму UDP. Эту функцию можно отключить. */
51 if (zerosum)
52 if (libnet_toggle_checksum(l, udp_tag, LIBNET_OFF) < 0)
53 err_quit("turning off checksums: %s\n", libnet_geterror(l));
54 /* формирование IP-заголовка */
55 ip_tag = libnet_build_ipv4(packet_size + LIBNET_IPV4_H /* длина */,
56 0 /* tos */, 0 /* IP ID */, 0 /* фрагмент*/,
57 TTL_OUT /* ttl */, IPPROTO_UDP /* протокол */,
58 0 /* контр. сумма */,
59 ((struct sockaddr_in*)local)->sin_addr.s_addr /* отправитель */,
60 ((struct sockaddr_in*)dest)->sin_addr.s_addr /* получатель */,
61 NULL /* полезные данные */, 0 /* длина полезн. данных */, l, ip_tag);
62 if (libnet_write(l) < 0) {
63 err_quit("libnet_write: %s\n", libnet_geterror(l));
64 }
65 if (verbose)
66 printf("sent: %d bytes of data\n", packet_size);
67 }
Формирование запроса DNS
25-32
Мы начинаем с формирования запроса DNS, которое выполняется так же, как в строках 25–30 листинга 29.8.
34-40
Затем мы вызываем функцию libnet_build_dnsv4
, которая принимает поля пакета DNS в виде отдельных аргументов. Нам достаточно знать содержимое запроса, а упорядочением этого содержимого в заголовке пакета DNS занимается функция. Заполнение заголовка UDP и подготовка к вычислению контрольной суммы UDP
Поделиться:
Популярные книги
Кодекс Крови. Книга VIII
8. РОС: Кодекс Крови
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Камень
1. Камень
Фантастика:
боевая фантастика
6.80
рейтинг книги
Партиец
2. Переломный век
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Он тебя не любит(?)
Любовные романы:
современные любовные романы
7.46
рейтинг книги
Бестужев. Служба Государевой Безопасности
1. Граф Бестужев
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Хозяйка брачного агентства или Попаданка в поисках любви
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Возрождение Феникса. Том 1
1. Возрождение Феникса
Фантастика:
фэнтези
попаданцы
альтернативная история
6.79
рейтинг книги
Релокант. Вестник
2. Релокант в другой мир
Фантастика:
фэнтези
попаданцы
рпг
5.00
рейтинг книги
Книга пяти колец. Том 3
3. Книга пяти колец
Фантастика:
фэнтези
попаданцы
аниме
5.75
рейтинг книги
Идеальный мир для Лекаря 8
8. Лекарь
Фантастика:
юмористическое фэнтези
аниме
7.00
рейтинг книги
Идеальный мир для Социопата 6
6. Социопат
Фантастика:
боевая фантастика
рпг
6.38
рейтинг книги
Камень. Книга 3
3. Камень
Фантастика:
фэнтези
боевая фантастика
8.58
рейтинг книги
Прометей: повелитель стали
3. Прометей
Фантастика:
фэнтези
7.05
рейтинг книги
Неудержимый. Книга XIX
19. Неудержимый
Фантастика:
фэнтези
попаданцы
аниме
5.00