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

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

Жанры

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

11 buf = Malloc(sizeof(struct udpiphdr) + 100);

12 ptr = buf + sizeof(struct udpiphdr); /* место для заголовков IP и UDP */

13 *((uint16_t*)ptr) = htons(1234); /* идентификатор */

14 ptr += 2;

15 *((uint16_t*)ptr) = htons(0x0100); /* флаги */

16 ptr += 2;

17 *((uint16_t*)ptr) = htons(1); /*
количество запросов */

18 ptr += 2;

19 *((uint16_t*)ptr) = 0; /* количество записей в ответе */

20 ptr += 2;

21 *((uint16_t*)ptr) = 0; /* количество авторитетных записей */

22 ptr += 2;

23 *((uint16_t*)ptr) = 0; /* количество дополнительных записей */

24 ptr += 2;

25 memcpy(ptr, "\001a\014root-servers\003net\000", 20);

26 ptr += 20;

27 *((uint16_t*)ptr) = htons(1); /* тип запроса = А */

28 ptr += 2;

29 *((uint16_t*)ptr) = htons(1); /* класс запроса = 1 (IP-адрес) */

30 ptr += 2;

31 nbytes = (ptr - buf) - sizeof(struct udpiphdr);

32 udp_write(buf, mbytes),

33 if (verbose)

35 printf("sent: %d bytes of data\n", nbytes);

36 }

Инициализация указателя на буфер

11-12
В буфере
buf
имеется место для 20-байтового заголовка IP, 8-байтового заголовка UDP и еще 100 байт для пользовательских данных. Указатель
ptr
установлен на первый байт пользовательских данных.

Формирование запроса DNS

13-24
Для понимания деталей устройства дейтаграммы UDP требуется понимание формата сообщения DNS. Эту информацию можно найти в разделе 14.3 [111]. Мы присваиваем полю идентификации значение 1234, сбрасываем флаги, задаем количество запросов — 1, а затем обнуляем количество записей ресурсов (RR, resource records), получаемых в ответ, количество RR, определяющих полномочия, и количество дополнительных RR.

25-30
Затем мы формируем простой запрос, который располагается после заголовка: запрос типа А IP-адреса узла
a.root-servers.net
. Это доменное имя занимает 20 байт и состоит из 4 фрагментов: однобайтовая часть
a
, 12-байтовая часть
root-servers
, 3-байтовая часть
net
и корневая часть, длина которой занимает 0 байт. Тип запроса 1 (так называемый запрос типа А), и класс запроса также 1.

Запись
дейтаграммы UDP

31-32
Это сообщение состоит из 36 байт пользовательских данных (восемь 2-байтовых полей и 20-байтовое доменное имя). Мы вызываем нашу функцию
udp_write
для формирования заголовков UDP и IP и последующей записи дейтаграммы UDP в наш символьный сокет.

В листинге 29.9 показана функция

open_output
, работающая с символьными сокетами.

Листинг 29.9. Функция open_output: подготовка символьного сокета

2 int rawfd; /* символьный сокет */

3 void

4 open_output(void)

5 {

6 int on=1;

7 /*

8 * Для отправки IP-дейтаграмм нужен символьный сокет

9 * Для его создания нужны права привилегированного пользователя.

10 * Кроме того, необходимо указать параметр сокета IP_HDRINCL.

11 */

12 rawfd = Socket(dest->sa_family, SOCK_RAW, 0);

13 Setsockopt(rawfd, IPPROTO_IP, IP_HDRINCL, &on., sizeof(on));

14 }

Объявление дескриптора символьного сокета

2
Мы объявляем глобальную переменную, в которой будет храниться дескриптор символьного сокета.

Создание сокета и установка IP_HDRINCL

7-13
Мы создаем символьный сокет и включаем параметр сокета
IP_HDRINCL
. Это позволяет нам формировать IP-дейтаграммы целиком, включая заголовок IP.

В листинге 29.10 показана наша функция

udp_write
, которая формирует заголовки IP и UDP, а затем записывает дейтаграмму в символьный сокет.

Листинг 29.10. Функция udp_write: формирование заголовков UDP и IP и запись дейтаграммы IP в символьный сокет

//udpcksum/udpwrite.c

19 void

20 udp_write(char *buf, int userlen)

21 {

22 struct udpiphdr *ui;

23 struct ip *ip;

24 /* заполнение заголовка и вычисление контрольной суммы */

25 ip = (struct ip*)buf;

26 ui = (struct udpiphdr*)buf;

27 bzero(ui, sizeof(*ui));

28 /* добавляем 8 к длине псевдозаголовка */

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

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

Чернованова Валерия Михайловна
Любовные романы:
любовно-фантастические романы
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