Windows Sockets: byte pedidos

Este artigo e dois artigos complementares explicam vários problemas na programação Windows Sockets.Este artigo aborda a ordenação de byte.Outras questões são abordadas nos artigos: Windows Sockets: O bloqueio de e Windows Sockets: Convertendo strings.

Se você usar ou deriva da classe CAsyncSocket, você precisará gerenciar estes problemas sozinho.Se você usar ou deriva da classe CSocket, O MFC gerencia-las para você.

byte pedidos

Arquiteturas de computador diferente, às vezes, armazenam dados usando ordens de byte diferentes.Por exemplo, computadores baseados no Intel armazenar dados na ordem inversa de computadores Macintosh (Motorola).A ordem de byte Intel, chamada "pouco-endian", também é o inverso da ordem de rede padrão "big-endian".A tabela a seguir explica esses termos.

Ordem de byte grande e little-endian

byte pedidos

Significado

Big-endian

O byte mais significativo é à esquerda participante de uma palavra.

Pouco-endian

O byte mais significativo é na extremidade direita de uma palavra.

Normalmente, não é necessário se preocupar sobre a conversão de ordem de byte de dados que você envia e recebe através da rede, mas há situações em que você deve converter ordens de byte.

Quando você deve converter byte pedidos

É necessário converter ordens de byte nas seguintes situações:

  • Você está passando informações que devem ser interpretados por rede, ao contrário de dados que você está enviando para outra computador.Por exemplo, você pode passar as portas e endereços, que a rede deve compreender.

  • O aplicativo do servidor com o qual você está se comunicando não é um aplicativo MFC (e você não tem o código-fonte para ele).Isso chama para conversões de ordem de byte se as duas máquinas não compartilham a ordenação de bytes mesmo.

Quando você não tiver converter byte pedidos

Você pode evitar o trabalho de conversão de ordens de byte nas seguintes situações:

  • Concorda as máquinas em ambas as extremidades podem com não troque bytes e as duas máquinas usam a mesma ordem de byte.

  • O servidor que você está se comunicando é um aplicativo MFC.

  • Você tiver código-fonte para o servidor que você está se comunicando com, portanto, você pode dizer explicitamente se você deve converter ordens de byte ou não.

  • Pode a porta do servidor para o MFC.Isso é bastante fácil de fazer e o resultado é geralmente código menor e mais rápido.

Trabalhando com CAsyncSocket, você deve gerenciar conversões qualquer ordem de byte necessário por conta própria.Windows Sockets padroniza o modelo de ordem de byte "big-endian" e fornece funções para converter entre este pedido e outros.CArchive, no entanto, que você usa com CSocket, usa a ordem oposta de ("pouco-endian"), mas CArchive cuida de detalhes de conversões de ordem de byte para você. Usando essa ordenação padrão em seus aplicativos, ou usando funções de conversão de ordem de byte do Windows Sockets, você pode tornar o seu código mais portátil.

O caso ideal para o uso de soquetes MFC é quando você está escrevendo ambas as extremidades de comunicação: Usar MFC em ambas as extremidades.Se você estiver escrevendo um aplicativo que irá se comunicar com aplicativos não-MFC, tais sistema autônomo um servidor FTP, você provavelmente precisará gerenciar byte-permutação você mesmo antes de passar dados para o objeto de arquivar, usando o Windows Sockets conversão rotinas ntohs, ntohl, htons, and htonl.Um exemplo dessas funções usados na comunicação com um aplicativo MFC não aparece mais adiante neste artigo.

Observação:

Quando o Outros participante da comunicação não é um aplicativo MFC, você também deve evitar objetos C++ derivados de streaming CObject para o arquivar porque o destinatário não poderá lidar com eles. Consulte a Observação Windows Sockets: Usando soquetes com arquivos.

Para obter mais informações sobre ordens de byte, consulte a especificação de Windows Sockets, disponível no Windows SDK.

Um exemplo de conversão-ordem de byte

O exemplo a seguir mostra uma função de serialização para um CSocket objeto que usa um sistema de arquivar. Ele também ilustra usando as funções de conversão de ordem de byte da API do Windows Sockets.

Este exemplo apresenta um cenário no qual você está escrevendo um cliente se comunica com um aplicativo do servidor não MFC para os quais você não tem acesso ao código-fonte.Nesse cenário, você deve assumir que o servidor não MFC usa rede padrão ordem de byte.Por outro lado, o aplicativo cliente MFC usa um CArchive objeto com um CSocket objeto, e CArchiveusa a ordem de byte "pouco-endian", o oposto da rede padrão.

Suponha que o servidor não MFC com o qual você pretende se comunicar tem um protocolo estabelecido para um pacote de mensagem semelhante ao seguinte:

struct Message
{
   long MagicNumber;
   unsigned short Command;
   short Param1;
   long Param2;
};

Em termos MFC, isso deve ser expresso sistema autônomo a seguir:

struct Message
{
    long m_lMagicNumber;
    short m_nCommand;
    short m_nParam1;
    long m_lParam2;

    void Serialize( CArchive& ar );
};

In C++, a struct é essencialmente a mesma coisa que uma classe. The Message estrutura pode ter funções de membro, sistema autônomo o Serialize função de membro declaradas acima. The Serialize função de membro pode ter esta aparência:

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

Este exemplo chama para conversões de ordem de bytes de dados porque há uma diferença clara entre a ordem de byte do aplicativo do servidor não MFC em uma participante e o CArchive usado em seu aplicativo cliente do MFC no Outros participante. O exemplo ilustra vários das funções de conversão de ordem de byte que Windows Sockets fornece.A tabela a seguir descreve essas funções.

Funções de conversão do Windows Sockets-ordem de byte

Função

Objetivo

ntohs

Converter uma quantidade de 16 bit de rede ordem de byte host ordem de byte (big-endian para bit-endian).

ntohl

Converter uma quantidade de 32 bit de rede ordem de byte host ordem de byte (big-endian para bit-endian).

Htons

Converta uma quantidade de 16 bit de ordem de byte de host em ordem de byte de rede (bit-endian para big-endian).

Htonl

Converta uma quantidade de 32 bit de ordem de byte de host em ordem de byte de rede (bit-endian para big-endian).

Outros ponto deste exemplo é que quando o aplicativo de soquete na Outros extremidade da comunicação é um aplicativo MFC não, você deve evitar fazer algo semelhante ao seguinte:

ar << pMsg;

em que pMsg é um ponteiro para um objeto C++ derivado da classe CObject. Isso enviará informações de MFC extras associadas a objetos e o servidor não entenda, sistema autônomo se fosse um aplicativo MFC.

Para obter mais informações, consulte:

Consulte também

Conceitos

Windows Sockets no MFC