114:  if (argc != 2) {

115:   fprintf(stderr, 'поддерживается только один аргумент ');

116:   return 1;

117:  }

118:

119:  /* Создание сокетов. Один служит для родительского процесса,

120:     второй — для дочернего (мы можем поменять их местами,

121:     если нужно). */

122:  if (socketpair(PF_UNIX, SOCK_STREAM, 0, socks))

123:   die('socketpair');

124:

125:  if (!fork()) {

126:   /* дочерний процесс */

127:   close(socks[0]);

128:   return childProcess(argv[1], socks[1]);

129:  }

130:

131:  /* родительский процесс */

132:  close(socks[1]);

133:  parentProcess(socks[0]);

134:

135:  /* закрытие дочернего процесса */

136:  wait(&status);

137:

138:  if (WEXITSTATUS(status))

139:   fprintf(stderr, 'childfailed ');

140:

141:  return 0;

142: }

17.5. Сетевая обработка с помощью TCP/IP

Самое важное применение сокетов заключается в том, что они позволяют приложениям, работающим на основе различных механизмов, общаться друг с другом. Семейство протоколов TCP/IP [34] используется в Internet самым большим в мире числом компьютеров, объединенных в сеть. Система Linux предлагает полную устойчивую реализацию TCP/IP, которая позволяет действовать и как сервер, и как клиент TCP/IP.

Наиболее распространенной версией TCP/IP является версия 4 (IPv4). В данный момент для большинства операционных систем и продуктов сетевой инфраструктуры уже доступна версия 6 протокола TCP/IP (IPv6), однако IPv4 доминирует до сих пор. В данном разделе мы сосредоточимся на создании приложений для IPv4, но обратим внимание на отличия для приложений IPv6, а также для тех программ, которые должны поддерживать обе версии.

17.5.1. Упорядочение байтов

Сети TCP/IP, как правило, являются неоднородными; они включают в себя широкий ряд механизмов и архитектур. Одно из основных отличий между архитектурами связано со способом хранения чисел.

Машинные числа составляются из последовательности байтов. Например, целые числа в С обычно представляются 4 байтами (32 битами). Существует довольно много способов хранения этих четырех байтов в памяти компьютера. Архитектуры с обратным порядком байтов сохраняют старший (наиболее значимый) байт в наименьшем аппаратном адресе, остальные следуют в порядке от более значимого к менее значимому. Механизмы с прямым порядком байтов хранят многобайтовые значения в абсолютно противоположном порядке: наименее значимый байт отправляется в наименьший адрес памяти. В других механизмах байты сохраняются в различных порядках.

Так как многобайтовые значения являются частью протокола TCP/IP, то разработчики протоколов позаботились о едином стандарте способа передачи многобайтовых значений через сеть[126]. TCP/IP требует использования обратного порядка байтов для передачи протокольной информации и рекомендует также применять его к данным приложений (хотя попытки зафиксировать формат потока данных приложений не предпринимались) [127]. Упорядочение, которое применяется для многобайтовых значений, передаваемых через сеть, известно как сетевой порядок байтов.

Для преобразования порядка байтов хоста в сетевой порядок байтов используются четыре функции.

#include <netinet/in.h>

unsigned int htonl(unsigned int hostlong);

unsigned short htons(unsigned short hostshort);

unsigned int ntohl(unsigned int netlong);

unsigned short ntohs(unsigned short netshort);

Несмотря на то что прототип каждой из этих функций принимает значение без знака, все они отлично работают и для значений со знаком.

Первые две функции htonl() и htons() преобразуют длинные и короткие числа соответственно из порядка байтов хоста в сетевой порядок байтов. Последние две ntohl() и ntohs() выполняют обратные преобразования длинных и коротких чисел (из сетевого порядка в порядок хоста).

Хотя мы использовали термин длинный в описаниях, на самом деле, это неправильно. Обе функции htonl() и ntohl() принимают 32-битные значения, а не те, которые относятся к типу long. В прототипах обеих функций предполагалось, что они обрабатывают значения int, поскольку все платформы Linux в настоящее время используют 32-битные целые числа.

17.5.2. Адресация IPv4

Соединения IPv4 представляют собой кортеж из 4-х элементов (локальный хост, локальный порт, удаленный хост, удаленный порт). До установки соединения необходимо определить каждую его часть. Элементы локальный хост и удаленный хост являются IPv4-адресами. IPv4- адреса — это 32-битные (4-байтовые) числа, уникальные для всей установленной сети. Как правило, они записываются в виде aaa.bbb.ccc.ddd, где каждый элемент адреса является десятичным представлением одного из байтов адреса машины. Первое слева число в адресе соответствует самому значимому байту в адресе. Такой формат для IPv4-адресов известен как десятичное

Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

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

Отметить Добавить цитату