Windows Sockets: Bytes pedidos

Este artigo e dois artigos complementar explicam vários problemas na programação de Sockets do Windows.Este artigo aborda a ordenação de bytes.Outros problemas são abordados nos artigos: Windows Sockets: bloqueando e Windows Sockets: convertendo Strings.

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

Ordenação de bytes

Arquiteturas de máquina diferente às vezes armazenam dados usando ordens de byte.Por exemplo, máquinas baseadas em Intel armazenam dados na ordem inversa de computadores Macintosh (Motorola).A ordem de bytes da Intel, chamada "little-Endian," também é o inverso da ordem padrão de "big-Endian" de rede.A tabela a seguir explica esses termos.

Ordem de Byte big e Little-Endian

Ordenação de bytes

Significado

Big-Endian

O byte mais significativo é a extremidade esquerda de uma palavra.

Little-Endian

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

Normalmente, você não precisa se preocupar sobre conversão de ordem de bytes de dados que você enviar e receber pela rede, mas há situações em que você deve converter bytes pedidos.

Quando você deve converter bytes pedidos

Você precisa converter bytes pedidos nas seguintes situações:

  • Passagem de informações que precisam ser interpretados pela rede, em oposição aos dados que você está enviando para outra máquina.Por exemplo, você pode passar as portas e endereços de rede deve compreender.

  • O aplicativo de servidor com o qual você está se comunicando não é um aplicativo MFC (e 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 mesma ordem dos bytes.

Quando não é necessário converter bytes pedidos

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

  • As máquinas em ambas as extremidades podem concordar não a troca de bytes e as duas máquinas usam a mesma ordem de byte.

  • Você está se comunicando com o servidor é um aplicativo do MFC.

  • Você tem o código-fonte para o servidor que você está se comunicando, então diga explicitamente se você deve converter bytes pedidos ou não.

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

Trabalhando com CAsyncSocket, você deve gerenciar qualquer conversões necessárias de ordem de byte.Windows Sockets padroniza o modelo de ordem de bytes "big-Endian" e fornece funções para converter entre este pedido e outros.CArchive, contudo, que você usar com CSocket, usa a ordem oposta ("little-Endian"), mas CArchive cuida dos 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 seu código mais portátil.

O caso ideal para usar soquetes MFC é quando estão escrevendo as duas extremidades da comunicação: usando o MFC em ambas as extremidades.Se você estiver escrevendo um aplicativo que irá se comunicar com aplicativos não-MFC, como, por exemplo, um servidor FTP, você provavelmente precisará gerenciar byte-swapping mesmo antes de passar dados para o objeto de arquivamento, usando as rotinas de conversão de Windows Sockets ntohs, ntohl, htons, e htonl.Um exemplo dessas funções usadas na comunicação com um aplicativo do MFC não aparece posteriormente neste artigo.

ObservaçãoObservação

Ao final da comunicação não é um aplicativo do MFC, você também deve evitar streaming objetos C++ derivados de CObject em seu arquivo porque o receptor não será capaz de lidar com eles.Consulte a observação no Windows Sockets: usando Sockets com arquivos.

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

Um exemplo de conversão de ordem de Byte

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

Este exemplo apresenta um cenário no qual você está escrevendo um cliente se comunica com um aplicativo de servidor não-MFC para o qual você não tem acesso ao código-fonte.Nesse cenário, você deve assumir que o servidor de MFC não usa a ordem de byte de rede padrão.Em contraste, o aplicativo cliente do MFC usa um CArchive de objeto com um CSocket objeto, e CArchive usa a ordem de bytes "little-Endian", o oposto de 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 seria expressa da seguinte maneira:

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

    void Serialize( CArchive& ar );
};

No C++, um struct é essencialmente a mesma coisa que uma classe.O Message estrutura pode ter funções de membro, como o Serialize função de membro declarado acima.O Serialize função de membro pode parecer com isso:

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 dos bytes do aplicativo do servidor não-MFC em uma extremidade e o CArchive usado no aplicativo MFC cliente na outra extremidade.O exemplo ilustra várias das funções de conversão de ordem de bytes que fornece Windows Sockets.A tabela a seguir descreve essas funções.

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

Função

Objetivo

ntohs

Converta uma quantidade de 16 bits de ordem de byte de rede em ordem de byte do host (big-Endian para little-Endian).

ntohl

Converta uma quantidade de 32 bits de ordem de byte de rede em ordem de byte do host (big-Endian para little-Endian).

Htons

Converta uma quantidade de 16 bits de ordem de byte de host para ordem de byte da rede (little-Endian para big-Endian).

Htonl

Converta uma quantidade de 32 bits de ordem de byte de host para ordem de byte da rede (little-Endian para big-Endian).

Outro ponto deste exemplo é que, quando o soquete na outra extremidade da comunicação é um aplicativo não-MFC, você deve evitar fazer algo como o seguinte:

ar << pMsg;

onde pMsg é um ponteiro para um objeto C++ derivado da classe CObject.Isso enviará informações extras do MFC associadas a objetos e o servidor não entender, como se fosse um aplicativo MFC.

Para obter mais informações, consulte:

Consulte também

Conceitos

Windows Sockets no MFC