Сокеты Windows. Порядок байтов
Данная статья базы знаний 2 и сопутствующей описан ряд проблем в программировании Windows SSL. Этот раздел содержит описание порядка байтов. Другие проблемы описаны в статьях. Windows SSL. Блокировка и Windows SSL. Преобразования строк.
При использовании или является производным от класса CAsyncSocket, необходимо самостоятельно управлять этих проблем. При использовании или является производным от класса CSocket, MFC управляет их автоматически.
Порядок байтов
Различные архитектуры компьютера иногда хранить данные с помощью различных порядка байтов. Например, на основе Intel компьютеры содержит данные в обратном порядке компьютера macintosh (Motorola). Вызывается порядка байтов, Intel маленьким «- так,» также обратный порядок стандартного сети «обратный порядок байтов». В следующей таблице приведены эти термины.
Крупно- и маленький — так порядка байтов
Порядок байтов |
Значение |
---|---|
Обратный порядок байтов |
Значительно байт с левой стороны ключевые слова. |
Маленький — так |
Значительно байт на правой стороны ключевые слова. |
Обычно не нужно беспокоиться о преобразовании порядка байтов для данных, отправке и получении по сети, но ситуации, в которых необходимо преобразовать порядка байтов.
Если необходимо преобразовать порядка байтов
Необходимо преобразовать порядка байтов в следующих случаях:
Если передать сведения, которые необходимо интерпретировать сети, в отличие от данных необходимо отправить на другом компьютере. Например, можно передать порты и адреса, сеть должна понять.
Серверное приложение, в котором она сообщения не приложения MFC (и необходимости не имеют исходный код для него). Этот метод вызывает для преобразований порядка байтов, если 2 компьютера не используют тот же порядок байтов.
Если не нужно преобразовать порядка байтов
Чтобы избежать преобразования рабочего порядка байтов в следующих случаях:
Компьютеры на обоих концах к не могут обмениваться байты, и оба компьютера используется тот же порядок байтов.
Сервер, сообщения с приложения MFC.
Имеется исходный код сервера для сообщения с, поэтому можно явно сообщает ли необходимо преобразовать порядка байтов или нет.
Можно порт сервера в MFC. Это справедливо простая задача, и это обычно меньше, чем быстрый код.
Работа с CAsyncSocket, должны самостоятельно управлять все необходимые преобразования порядка байтов. Windows унифицируют SSL «обратный порядок байтов» модель порядка байтов и обеспечивает функции преобразования между данным заказом и другими. CArchive однако, который используется с CSocket, используется противоположный (маленький «-» порядок байтов), но CArchive позаботит освобождает данные преобразований порядка байтов автоматически. С помощью этого стандартный заказ в приложениях, или использовать функции преобразования порядка байтов Windows SSL можно сделать код более портативным.
Идеальное вариант использования сокетов MFC при написании оба окончания сообщения: использование MFC на обоих концах. При создании, приложение, которое будет взаимодействовать с приложениями библиотеки, таких как FTP-сервер, возможно, потребуется управлять байт- переключение перед загрузкой данных в объект архива, преобразования с помощью процедуры ntohs, ntohl, htons и htonl Windows SSL. Пример этих функций, используемых в взаимодействовать с приложением библиотеки " ниже в данном разделе.
Примечание
Если другой конец сообщения не приложения MFC, также следует избегать десериализации объектов C++, производные от CObject в архив, поскольку получатель не обработает их.См. примечание в Windows SSL. С помощью сокетов с архивами.
Дополнительные сведения о порядка байтов см. в спецификации Windows SSL, доступная в Windows SDK.
Пример преобразования порядка байтов
В следующем примере показана функция сериализации для объекта CSocket, использующий архив. Он также показано использование функций преобразования порядка байтов в API Windows SSL.
Этот пример содержит сценарий, в котором нужно создать клиент, который взаимодействует с серверными приложениями библиотеки, для которого нет доступа к исходному коду. В этом сценарии необходимо высказывать сервер библиотеки используется стандартный порядок байтов сети. Напротив, клиентское приложение MFC использует объект CArchive с объектом CSocket и CArchive используется «маленький — так» порядок байтов, то стандарта сети.
Предположим, что сервер библиотеки, с которым требуется установить связь имеет протокол для пакета сообщения следующим образом:
struct Message
{
long MagicNumber;
unsigned short Command;
short Param1;
long Param2;
};
С MFC, это будет выражено следующим образом:
struct Message
{
long m_lMagicNumber;
short m_nCommand;
short m_nParam1;
long m_lParam2;
void Serialize( CArchive& ar );
};
В C++ struct — то же самое, что и класс. Структура Message может иметь функции-члены, например функцию-член Serialize объявленный выше. Функция-член Serialize может выглядеть следующим образом:
void Message::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{
ar << (DWORD)htonl(m_lMagicNumber);
ar << (WORD)htons(m_nCommand);
ar << (WORD)htons(m_nParam1);
ar << (DWORD)htonl(m_lParam2);
}
else
{
WORD w;
DWORD dw;
ar >> dw;
m_lMagicNumber = ntohl((long)dw);
ar >> w ;
m_nCommand = ntohs((short)w);
ar >> w;
m_nParam1 = ntohs((short)w);
ar >> dw;
m_lParam2 = ntohl((long)dw);
}
}
Вызовы этого примера для преобразований порядка байтов данных, поскольку определенного порядка байтов несоответствие между серверной библиотеки на одном конце и CArchive, используемым в клиентском приложении MFC на другом закончена. Пример иллюстрирует несколько функций преобразования порядка байтов, предоставляет Windows SSL. В следующей таблице описаны эти функции.
Функции преобразования порядка байтов Windows SSL
Функция |
Назначение |
---|---|
ntohs |
Преобразование 16 8-разрядное число от порядка байтов сети с порядком байтов узла (обратный порядок байтов в маленькому — прямой порядок байтов). |
ntohl |
Преобразование 32 8-разрядное число от порядка байтов сети с порядком байтов узла (обратный порядок байтов в маленькому — прямой порядок байтов). |
Htons |
Преобразование 16 8-разрядное число от порядка байтов узла с порядком байтов сети (маленькому — байтов на обратный порядок байтов). |
Htonl |
Преобразование 32 8-разрядное число от порядка байтов узла с порядком байтов сети (маленькому — байтов на обратный порядок байтов). |
Другая точка этого примера, когда приложение сокета на другом конце сообщения приложения библиотеки, не следует делать примерно следующим образом:
ar << pMsg;
, где pMsg указатель на объект C++, производный от класса CObject. Это отправляет дополнительные данные по MFC, связанные с объектами и сервер не поймет его, так как его, как приложением MFC.
Дополнительные сведения см. в следующих разделах: