Читаем 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 нулевое значение контрольной суммы не означает ее отсутствия.

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

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

1001 совет по обустройству компьютера
1001 совет по обустройству компьютера

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

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

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

В книге рассматривается широкий круг вопросов, связанных с использованием программной среды Access 2002, которая является составной частью пакета Office 2002 и предназначена для создания банка данных в самых различных предметных областях.Подробно описывается методика проектирования объектов базы данных (таблицы, формы, отчеты, страницы доступа к данным, запросы, модули).Детально обсуждаются вопросы создания интегрированной базы данных в единой среде Access 2002: формирование БД с нуля, конвертирование в программную среду баз данных, созданных в ином программном окружении – Clarion, FoxPro.Особое внимание уделяется формированию разнообразных запросов к интегрированной базе данных Access 2002 с использованием языков программирования SQL, VBA и макросов.Приводятся общие сведения о возможностях языка обмена данными между различными компьютерами и приложениями (XML). Описываются возможности использования гиперссылок, связывающих базу данных с другими программными продуктами. Объясняется, как можно работать с базой данных Access 2002 без установки ее на компьютер, используя технологию ODBC (Open Data Base Connectivity). В приложениях приводятся количественные параметры Access 2002 и связанная с этой СУБД терминология.Предлагаемая книга будет полезна специалистам, занимающимся практической разработкой банков данных и приложений на их основе, а также студентам вузов, изучающим информатику.

Павел Юрьевич Дубнов

Программирование, программы, базы данных / ОС и Сети / Книги по IT