Процедуры для преобразования сетевого порядка следования байтов

Вспомним, что разные типы компьютеров отличаются между собой способом хранения в памяти величин целого типа, а также то, что в семействе протоколов TCP/IP определен независимый порядок следования байтов. Поэтому в API-интерфейсе сокетов предусмотрены четыре библиотечные функции, которые обеспечивают преобразование порядка следования байтов локальной машины в принятый в сети стандарт, и наоборот. Для обеспечения мобильности программ, они должны быть написаны таким образом, чтобы каждый раз при копировании целого значения из локальной машины в сетевой пакет, или наоборот, вызывались процедуры преобразования порядка следования байтов.

Все четыре процедуры преобразования являются функциями, которые возвращают значение переданного им единственного параметра с перегруппированными байтами. Например, чтобы преобразовать короткое (2-байтовое) целое число из принятого в сети порядка следования байтов в порядок байтов, установленный на локальном узле сети, программист должен вызвать функцию ntohs (network to host short). Эта функция имеет следующий синтаксис: локальное-значение = ntohs(сетевое-значение)

Параметр сетевое-значение представляет собой 2-байтовое (16-битовое) целое число, представленное в принятом в сети порядке следования байтов, а возвращаемый параметр локальное-значение представлен в порядке байтов, который установлен для локального узла сети.

В языке программирования С 4-байтовые (32-битовые) целые числа имеют тип long и называются длинными целыми. Функция ntohl (network to host long) преобразует 4-байтовые длинные целые числа из принятого в сети порядка байтов в порядок байтов, установленный для локального узла. При вызове функции ntohl ей в качестве параметра передается длинное целое число, представленное в сетевом порядке следования байтов:

локальное-значение = ntohl(сетевое-значение)

Две аналогичные функции позволяют программисту преобразовать порядок байтов целого числа, который принят на локальном узле сети, в сетевой порядок. Функция htons преобразует 2-байтовое (короткое) целое число в сетевой порядок следования байтов. При вызове функции htons ей в качестве параметра передается короткое целое число:

сетевое-значение = htons(локальное-значение)

Последняя подпрограмма преобразования, htonl, преобразует длинные целые числа в принятый в сети порядок следования байтов. Подобно другим подпрограммам, htonl представляет собой функцию:

сетевое-значение = htonl(локальное-значение)

Очевидно, что в подпрограммах преобразования должны сохраняться следующие математические соотношения:

сетевое-значение = htons(ntohs(сетевое-значение)) и локальное-значение = ntohs(htons(локальное-значение))

Похожие соотношения сохраняются и для подпрограмм преобразования длинных целых чисел.

Подпрограммы обработки IР-адресов

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

IP-адрес = inet_addr(строка) и IP-адрес = inet_network{строка)

Здесь параметр строка задает адрес ASCII-строки, содержащей IP-адрес, представленный в точечной десятичной форме записи. В этой форме IP-адрес может иметь от 1 до 4 сегментов цифр, разделенных точками. Если представление состоит из четырех сегментов, то каждый из них соответствует одному байту полученного в результате 32-битового целого числа. Если сегментов меньше четырех, в оставшиеся байты помещается значение последнего сегмента.

Процедура inet_ntoa осуществляет обратную процедуре inet_addr операцию — преобразует 32-х битовое целое число в ASCII-строку, содержащую IP-адрес, представленный в точечной десятичной форме записи. Эта процедура имеет следующий синтаксис:

строка = inet_ntoa(IP-адрес)

Здесь параметр IP-адрес — 32-битовый IP-адрес, представленный в сетевом порядке следования байтов, а параметр строка — адрес буфера, куда будет помещена сформированная ASCII-строка.

Часто обрабатывающие IP-адреса программы должны объединить адрес сети с локальным адресом узла и сформировать единый IP-адрес. Такое объединение выполняет процедура inet_makeaddr. Она имеет следующий синтаксис:

IP-адрес = inet_makeaddr(адрес-сети, адрес-узла)

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

Процедуры inet_netof и inet_lnaof выполняют операцию обратную процедуре inet_makeaddr, разделяя сетевую и локальную часть IP-адреса. Они имеют следующий синтаксис:

адрес-сети = inet_netof(IP-адрес) и адрес-узла = inet_lnaof(IP-адрес),

Здесь параметр IP-адрес представляет собой 32-битовый IP-адрес, заданный в сетевом порядке следования байтов, а полученные значения возвращаются в локальном порядке следования байтов.

Похожие статьи Меню Опрос Фото Популярное