Читаем Linux API. Исчерпывающее руководство полностью

• в отличие от датаграммных сокетов UNIX-домена, UDP-сокеты не являются надежными: пакеты могут теряться, дублироваться или приходить не в том порядке, в котором они были отправлены;

• отправка пакетов через датаграммный сокет UNIX-домена блокируется, если очередь данных принимающего сокета заполнена. Для сравнения: если UDP-датаграмма грозит переполнить очередь получателя, она просто автоматически отклоняется.

55.2. Порядок байтов в сети

IP-адреса и номера портов являются целыми числами. Одна из проблем, с которой можно столкнуться при передаче этих значений по сети, такова: различные аппаратные платформы хранят байты целого числа в разном порядке (при условии, что их больше одного). Как показано на рис. 55.1, существуют платформы, где целое значение начинается со старшего байта (то есть с наименьшего адреса); иногда их называют big endian («тупоконечными»). Платформы, в которых целые значения начинаются с младшего байта, называют little endian, или «остроконечными». (Эти названия заимствованы из сатирического романа Джонатана Свифта «Путешествия Гулливера» [1726 год], там они использовались для обозначения враждующих политических фракций, разбивающих вареные яйца с разных концов.) Наиболее заметным примером архитектуры little endian является x86 (можно также вспомнить архитектуру VAX компании Digital, на компьютерах которой активно применялась система BSD). В большинстве других платформ байты хранятся в порядке от старшего к младшему. Есть также несколько архитектур, способных переключаться между этими форматами. Порядок следования байтов на конкретном компьютере называют локальным.

Рис. 55.1. Разный порядок следования байтов в 2- и 4-байтных целых числах

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

Позже в данной главе мы рассмотрим различные функции для приведения имен сетевых узлов (например, www.kernel.org) и служб (например, http) к соответствующему цифровому представлению. Обычно они возвращают целые числа в сетевом порядке следования байтов, которые можно скопировать непосредственно в подходящие поля структуры для хранения адреса сокета.

Но иногда с целочисленными константами для IP-адресов и номеров портов приходится работать напрямую. Например, чтобы явно указать номер порта в коде нашей программы, получить его в качестве аргумента командной строки или воспользоваться константами INADDR_ANY и INADDR_LOOPBACK при определении IPv4-адреса. В языке C эти значения представлены в том формате, который используется на текущем компьютере. Прежде чем задействовать их в структуре для хранения адреса сокета, следует привести их к сетевому порядку следования байтов.

Для преобразования целых чисел между стандартным сетевым форматом и представлением, применяемым на текущем компьютере, предусмотрены функции tons(), htonl(), ntohs() и ntohl() (обычно они реализованы в виде макросов).

#include

uint16_t htons(uint16_t host_uint16);

Возвращает значение host_uint16, приведенное к сетевому порядку следования байтов

uint32_t htonl(uint32_t host_uint32);

Возвращает значение host_uint32, приведенное к сетевому порядку следования байтов

uint16_t ntohs(uint16_t net_uint16);

Возвращает значение net_uint16, приведенное к порядку следования байтов, которое применяется на текущем компьютере

uint32_t ntohl(uint32_t net_uint32);

Возвращает значение net_uint32, приведенное к порядку следования байтов, используемое на текущем компьютере

Когда-то эти функции имели прототипы следующего вида:

unsigned long htonl(unsigned long hostlong);

Это объясняет происхождение их имен: в данном случае htonl расшифровывается как host to network long (локальный формат в сетевом, тип long). В большинстве старых систем, где были реализованы сокеты, короткие целые числа занимали 16 бит, а длинные — 32 бита. Сейчас же все иначе (как минимум в случае с короткими целыми числами), поэтому прототипы, приведенные выше, более точно определяют типы данных, с которыми имеют дело указанные функции, хотя сами имена остались без изменений. Типы uint16_t и uint32_t предназначены для хранения 16- и 32-разрядных беззнаковых целых значений.

Строго говоря, реальная необходимость в этих четырех функциях возникает только в системах, где локальный порядок следования байтов отличается от сетевого. Тем не менее их следует использовать в любом случае, чтобы обеспечить портируемость программ между разными аппаратными архитектурами. В системах, где локальный порядок следования байтов совпадает с сетевым, приведенные функции просто возвращают передаваемые им аргументы.

55.3. Представление данных
Перейти на страницу:

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

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

Финансы / Программирование, программы, базы данных