Поделиться через


Порядок байтов

Всегда следует учитывать различия между упорядочением байтов, используемым для хранения целых чисел в архитектуре узла, и порядком байтов, используемым в проводной сети отдельными протоколами транспорта. Любая ссылка на адрес или номер порта, передаваемые в подпрограмму сокетов Windows или из нее, должна находиться в сетевом порядке (big-endian) для используемого протокола. В случае с IP-адресом сюда входят ip-адрес и параметры порта структуры sockaddr (но не параметр sin_family ).

Ряд систем UNIX работают на ЦП, которые представляют целые числа в порядке сетевых байтов (big-endian). Таким образом, необходимость преобразования целых чисел из порядка байтов узла в порядок байтов сети можно игнорировать, не вызывая проблем, даже если это не рекомендуется для переноса.

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

Рассмотрим приложение, которое обычно связывается с сервером через TCP-порт, соответствующий службе времени, но предоставляет пользователю механизм для указания альтернативного порта. Номер порта, возвращаемый командлетом getservbyname , уже находится в сетевом порядке, что является форматом, необходимым для создания адреса, чтобы преобразование не требовалось. Однако если пользователь решает использовать другой порт, введенный как целое число, приложение должно преобразовать его из узла в сетевой порядок TCP/IP (с помощью функции htons или WSAHtons ), прежде чем использовать его для создания адреса. И наоборот, если приложение должно было отобразить номер порта в адресе (например, возвращается getpeername ), номер порта должен быть преобразован из сети в порядок размещения (с помощью функции ntohs или WSANtohs ), прежде чем его можно будет отобразить.

Так как порядок байтов Intel и Интернет отличается, преобразования, описанные выше, неизбежны. Авторы приложений предупреждаются, что им следует использовать стандартные функции преобразования, предоставляемые в составе Winsock, а не писать собственный код преобразования, так как будущие реализации Winsock, скорее всего, будут выполняться в системах, для которых порядок узлов идентичен порядку байтов сети. Переносятся только приложения, использующие стандартные функции преобразования между порядком байтов узла и сети.

getpeername

getservbyname

htonl

htons

ntohl

ntohs

Перенос сокетных приложений в Winsock

sockaddr

Рекомендации по программированию Winsock

WSAHtonl

WSAHtons

WSANtohl

WSANtohs