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

на главную

Жанры

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

29 ui->ui_len = htons((uint16_t)(sizeof(struct udphdr) + userlen));

30 /* добавление 28 к длине IP-дейтаграммы */

31 userlen += sizeof(struct udpiphdr);

32 ui->ui_pr = IPPROTO_UDP;

33 ui->ui_src.s_addr = ((struct sockaddr_in*)local)->sin_addr.s_addr;

34 ui->ui_dst.s_addr = ((struct sockaddr_in*)dest)->sin_addr.s_addr;

35 ui->ui_sport = ((struct sockaddr_in*)local)->sin_port;

36 ui->ui_dport = ((struct sockaddr_in*)dest)->sin_port;

37 ui->ui_ulen = ui->ui_len;

38 if (zerosum == 0) {

39 #if 1 /*
заменить на if 0 для Solaris 2.x. x < 6 */

40 if ((ui->ui_sum = m_cksum((u_int16_t*)in, userlen)) == 0)

41 ui->ui_sum = 0xffff;

42 #else

43 ui->ui_sum = ui->ui_len;

44 #endif

45 }

46 /* заполнение оставшейся части IP-заголовка */

47 /* функция p_output вычисляет и сохраняет контрольную сумму IP */

48 ip->ip_v = IPVERSION;

49 ip->ip_hl = sizeof(struct ip) >> 2;

50 ip->ip_tos = 0;

51 #if defined(linux) || defined(__OpenBSD__)

52 ip->ip_len = htons(userlen); /* сетевой порядок байтов */

53 #else

54 ip->ip_len = userlen; /* порядок байтов узла */

55 #endif

56 ip->ip_id = 0; /* это пусть устанавливает уровень IP */

57 ip->ip_off = 0; /* смещение флагов, флаги MF и DF */

58 ip->ip_ttl = TTL_OUT;

59 Sendto(rawfd, buf, userlen, 0, dest, destlen);

60 }

Инициализация указателей на заголовки пакетов

24-26
Указатель
ip
указывает на начало заголовка IP (структуру
ip
), а указатель
ui
указывает на то же место, но структура
udpiphdr
является объединением заголовков IP и UDP.

Обнуление заголовка

27
Мы явным образом записываем в заголовок нули, чтобы предотвратить учет случайного мусора, который мог остаться в буфере, при вычислении контрольной суммы.

Обновление значений длины

28-31
Переменная
ui_len
— это длина дейтаграммы UDP: количество байтов пользовательских данных плюс размер заголовка UDP (8 байт). Переменная
userlen
(количество байтов
пользовательских данных, которые следуют за заголовком UDP) увеличивается на 28 (20 байт на заголовок IP и 8 байт на заголовок UDP), для того чтобы соответствовать настоящему размеру дейтаграммы IP.

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

32-45
При вычислении контрольной суммы UDP учитывается не только заголовок и данные UDP, но и поля заголовка IP. Эти дополнительные поля заголовка IP образуют то, что называется псевдозаголовком( pseudoheader). Включение псевдозаголовка обеспечивает дополнительную проверку на то, что если значение контрольной суммы верно, то дейтаграмма была доставлена на правильный узел и с правильным кодом протокола. В указанных строках располагаются операторы инициализации полей в IP-заголовке, формирующих псевдозаголовок. Данный фрагмент кода несколько запутан, но его объяснение приводится в разделе 23.6 [128]. Конечным результатом является запись контрольной суммы UDP в поле
ui_sum
, если не установлен флаг
zerosum
(что соответствует наличию аргумента командной строки -0).

Если при вычислении контрольной суммы получается 0, вместо него записывается значение

0xffff
. В обратном коде эти числа совпадают, но протокол UDP устанавливает контрольную сумму в нуль, чтобы обозначить, что она вовсе не была вычислена. Обратите внимание, что в листинге 28.10 мы не проверяем, равно ли значение контрольной суммы нулю: дело в том, что в случае ICMPv4 нулевое значение контрольной суммы не означает ее отсутствия.

ПРИМЕЧАНИЕ

Следует отметить, что в Solaris 2.x, где x<6, в случаях, когда дейтаграммы UDP или сегменты TCP отправляются с символьного сокета при установленном параметре IP_HDRINCL, возникает ошибка. Контрольную сумму вычисляет ядро, а мы должны установить поле ui_sum равным длине дейтаграммы UDP.

Заполнение заголовка IP

36-49
Поскольку мы установили параметр сокета
IP_HDRINCL
, нам следует заполнить большую часть полей в заголовке IP. (В разделе 28.3 обсуждается запись в символьный сокет при включенном параметре
IP_HDRINCL
.) Мы присваиваем полю идентификации нуль (
ip_id
), что указывает IP на необходимость задания значения этого поля. IP также вычисляет контрольную сумму IP, а функция
sendto
записывает дейтаграмму IP.

ПРИМЕЧАНИЕ

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

Следующая функция — это

udp_read
, показанная в листинге 29.11. Она вызывается из кода, представленного в листинге 29.6.

Листинг 29.11. Функция udp_read: чтение очередного пакета из устройства захвата пакетов

//udpcksum/udpread.c

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

Идущий в тени 4

Амврелий Марк
4. Идущий в тени
Фантастика:
боевая фантастика
6.58
рейтинг книги
Идущий в тени 4

Дракон с подарком

Суббота Светлана
3. Королевская академия Драко
Любовные романы:
любовно-фантастические романы
6.62
рейтинг книги
Дракон с подарком

Я снова не князь! Книга XVII

Дрейк Сириус
17. Дорогой барон!
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я снова не князь! Книга XVII

Метка драконов. Княжеский отбор

Максименко Анастасия
Фантастика:
фэнтези
5.50
рейтинг книги
Метка драконов. Княжеский отбор

Авиатор: назад в СССР 11

Дорин Михаил
11. Покоряя небо
Фантастика:
альтернативная история
5.00
рейтинг книги
Авиатор: назад в СССР 11

На границе империй. Том 7. Часть 5

INDIGO
11. Фортуна дама переменчивая
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 7. Часть 5

Темный охотник 6

Розальев Андрей
6. КО: Темный охотник
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Темный охотник 6

Корпулентные достоинства, или Знатный переполох. Дилогия

Цвик Катерина Александровна
Фантастика:
юмористическая фантастика
7.53
рейтинг книги
Корпулентные достоинства, или Знатный переполох. Дилогия

Все еще не Герой!. Том 2

Довыдовский Кирилл Сергеевич
2. Путешествие Героя
Фантастика:
боевая фантастика
юмористическое фэнтези
городское фэнтези
рпг
5.00
рейтинг книги
Все еще не Герой!. Том 2

Довлатов. Сонный лекарь 3

Голд Джон
3. Не вывожу
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Довлатов. Сонный лекарь 3

Попаданка в деле, или Ваш любимый доктор - 2

Марей Соня
2. Попаданка в деле, или Ваш любимый доктор
Любовные романы:
любовно-фантастические романы
7.43
рейтинг книги
Попаданка в деле, или Ваш любимый доктор - 2

Возмездие

Злобин Михаил
4. О чем молчат могилы
Фантастика:
фэнтези
7.47
рейтинг книги
Возмездие

Ваше Сиятельство 8

Моури Эрли
8. Ваше Сиятельство
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Ваше Сиятельство 8

Чемпион

Демиров Леонид
3. Мания крафта
Фантастика:
фэнтези
рпг
5.38
рейтинг книги
Чемпион