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


Windows sockets: Порядок байтов

Данная статья 2 статей и сопровождающий описывается ряд проблем в программировании Windows sockets.В этой статье описывается порядок байтов.Другие вопросы описаны в статьях: Windows sockets: Отключение и Windows sockets: Преобразование строк.

При использовании или производного от класса CAsyncSocket, вам потребуется самостоятельно управлять этих проблем.При использовании или производного от класса CSocket, MFC управляет их автоматически.

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

Различные архитектуры компьютера иногда хранятся данные, используя разные порядки байтов.Например, основанных на компьютер Intel сохранять данные в обратном порядке компьютера macintosh (Motorola).Порядок байтов с именем Intel «прямой порядок байтов также обратить,» order «обратного порядка байтов» стандартного сети.Следующая таблица описывает эти термины.

Упорядочение Больших и с прямым порядком следования байтов в байтах

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

Значение

Обратный порядок байтов

Значащий байт слева конце слова.

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

Значащий байт в правом конце слова.

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

Если необходимо преобразовать порядок байтов

Необходимо преобразовать порядка байтов в следующих ситуациях:

  • Передаче сведения, которые необходимо интерпретировать сети, в отличие от данных отправляются на другой компьютер.Например, можно передать порты и адреса, которые должна понять сети.

  • Серверное приложение, с которым вы не связываете приложения MFC (и не имеют исходный код для него).Эти вызовы для преобразований порядка байтов, если 2 компьютера не используют один и тот же порядок байтов.

Если не нужно преобразовать порядок байтов

Можно избежать рабочий преобразовать порядок байтов в следующих ситуациях:

  • Компьютеры на обоих концах могут требованию байт, а не передавать оба компьютера используют один и тот же порядок байтов.

  • Сервер связываете с приложение MFC.

  • Имеется исходный код для сервера с связываете, поэтому можно указать явно, необходимо преобразовать порядка байтов или нет.

  • Порт сервера можно с MFC.Это довольно легко, чтобы сделать результат, и меньший, как правило, более быстрый код.

Работа с CAsyncSocket, необходимо самостоятельно управлять все необходимые преобразования порядка байтов.Windows sockets унифицируют модель порядка байтов «обратного порядка байтов и предоставляют функции для преобразования между данным заказом и другими.CArchive, однако, используемая с противоположным CSocket, используется прямой порядок байтов («порядок»), но CArchive позаботится сведения о преобразованиях порядка байтов.Используя этот стандартный упорядочение в приложениях или использования функций преобразования порядка байтов Windows sockets можно сделать код более портативным.

В идеале аргументы, с помощью сокетов MFC при написании оба элемента сообщения: использование MFC на обоих концах.При написании, приложение, которое будет взаимодействия с приложениями, не являющихся mfc, в качестве ftp-сервера, возможно, будет необходимо управлять байт-Переключить прежде чем передать данные в объект архива, с помощью процедуры преобразования ntohs, ntohl, htons и sockets htonl Windows.Пример этих функций, используемых в связи с приложением, не являющихся mfc отображается далее в этой статье.

ПримечаниеПримечание

Если другой конец сообщения не является приложения MFC, также следует избегать потоковой передачи объектов C++, производные от CObject в архив поскольку получатель не будет обрабатывать их.См. примечание в Windows sockets: Использование сокета с архивами.

Дополнительные сведения о порядках байтов см. в разделе спецификация Windows sockets, доступный в Windows SDK.

Пример преобразования порядка байтов

В следующем примере показана функция сериализации для объекта CSocket, использующий архива.Он также иллюстрирует использование функции преобразования порядка байтов в API Windows sockets.

Этот пример представляет собой сценарий, в котором создается клиент, который взаимодействует с серверным приложением, не являющихся mfc, для которого нет никакого доступа к исходному коду.В этом сценарии предполагается, что сервер, не являющихся mfc используется стандартный порядок байтов сети.Напротив, клиентское приложение MFC использует объект CArchive с объектом CSocket и CArchive использует порядок байтов «с прямым порядком следования байтов», обратное стандарта сети.

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

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);
    }
}

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

Функции преобразования порядка байтов Windows sockets

Функция

Назначение

ntohs

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

ntohl

Преобразование 32 число от порядка следования байтов сети с порядком байтов узла (обратного порядком байтов к прямому порядком байтов).

Htons

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

Htonl

Преобразование 32 число от порядка следования байтов узла с порядком байтов сети (прямому порядком байтов методу обратного порядком байтов).

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

ar << pMsg;

где pMsg указатель на объект C++, производный от класса CObject.Это отправляет дополнительные сведения о MFC, связанные с объектами и сервер не поймет, по мере их в приложении MFC.

Дополнительные сведения см. в следующих разделах.

См. также

Основные понятия

Windows sockets в MFC