Compartilhar via


Windows Sockets: exemplo de soquetes que usam arquivos mortos

Este artigo apresenta um exemplo de como usar a classe CSocket. O exemplo utiliza objetos de CArchive para serializar dados por meio de um soquete. Observe que esta não é serialização do documento para ou de um arquivo.

O exemplo a seguir ilustra como você usa o arquivo morto para enviar e receber dados entre objetos de CSocket . O exemplo é criado para que duas instâncias de troca de dados do aplicativo (no mesmo computador ou em computadores diferentes na rede). Uma instância enviará os dados, que a outra instância recebe e reconhece. Um ou outro aplicativo pode iniciar uma troca, e qualquer pessoa pode atuar como o servidor ou como o cliente ao outro aplicativo. A seguinte função é definida na classe de exibição de aplicativo:

void PacketSerialize(long nPackets, CArchive& arData, CArchive& arAck)
{
   BYTE bValue = 0;
   WORD nCopies = 0;

    if (arData.IsStoring())
    {
        CString strText;
        errno_t err;
        unsigned int number;

        for(int p = 0; p < nPackets; p++)
        {
            err = rand_s(&number);
            // if (err == 0)...
            bValue = (BYTE)(number%256);

            err = rand_s(&number);
            // if (err == 0)...
            nCopies = (WORD)(number%32000);

            // Send header information
            arData << bValue << nCopies;
            for(int c = 0; c < nCopies; c++)
            {
                // Send data
                arData << bValue;
            }

            strText.Format(_T("Sender sent packet %d of %d (Value = %d, Copies = %d)"),
            p + 1, nPackets, (int)bValue, nCopies);

            // Send receipt string
            arData << strText;
            arData.Flush();

            // Receive acknowledgment
            arAck >> strText;
            // display it
            DisplayMessage(strText);
        }
    }
    else
    {
        CString strText;
        BYTE bCheck;

        for(int p = 0; p < nPackets; p++)
        {
            // Receive header information
            arData >> bCheck >> nCopies;
            for(int c = 0; c < nCopies; c++)
            {
                // Receive data
                arData >> bValue;
                if (bCheck != bValue)
            {
               AfxMessageBox(_T("Packet Failure"));
            }
         }

         // Receive receipt string and display it
         arData >> strText;
         DisplayMessage(strText);

         strText.Format(_T("Recipient received packet %d of %d (Value = %d, Copies = %d)"), 
            p + 1, nPackets, (int)bValue, nCopies);

         // Send acknowledgment
         arAck << strText;
         arAck.Flush();
      }
    }
}

A é a mais importante sobre este exemplo é que suas paralelas da estrutura de MFC um Serialize funcione. A função de membro de PacketSerialize consiste em uma instrução de if com uma cláusula de else . A função recebe duas referências de CArchive como parâmetros: arData e arAck. Se o objeto de arquivo de arData está definido para enviar (), a ramificação de if é executado; caso contrário, se arData está definido para a carga (pull) a função usa a ramificação de else . Para obter mais informações sobre a serialização MFC no, consulte Serialização.

Dica

O objeto de arquivo de arAck é considerado como o oposto de arData.Se arData está enviando, arAck receber, e o inverso é true.

Para enviar, a função de exemplo de looping para um número especificado de vezes, gerando sempre alguns dados aleatórios para demonstração propósitos. Obtém ao seu aplicativo dados reais de alguma origem, como um arquivo. O operador insert de arquivo de arData (<<) é usado para enviar um fluxo de três partes sucessivas de dados:

  • “Um” cabeçalho que especifiquem a natureza de dados (nesse caso, o valor da variável de bValue e quantas cópias sejam enviadas).

    Ambos os itens são gerados aleatoriamente para este exemplo.

  • O número especificado de cópias de dados.

    O loop interno de for envia bValue o número especificado de vezes.

  • Uma cadeia de caracteres chamou strText que o destinatário exibe ao usuário.

Para receber, a função opera de maneira semelhante, exceto que usa o operador de extração de arquivo morto**>>**() para obter dados de arquivo morto. O aplicativo receptor verifica os dados que recebe, exibe a mensagem “recebida” final, e envia de volta uma mensagem que diz “enviado” para que o aplicativo que envia exibe.

As comunicações neste modelo, a palavra “recebidas”, a mensagem enviada na variável de strText , são para exibição em outro extremamente de comunicação, assim que especifica o usuário receptor que um determinado número de pacotes de dados foram recebidos. O destinatário responder com uma cadeia de caracteres semelhante que diz “enviado”, para exibição na tela original do remetente. O recebimento de ambas as cadeias de caracteres indica que a comunicação com êxito ocorreu.

Aviso

Se você estiver escrevendo um programa cliente MFC para se comunicar com os servidores (não) MFC estabelecidas, não enviar objetos C++ por meio do arquivo morto.A menos que o servidor é um aplicativo de MFC que compreende os tipos de objetos você deseja enviar, não poderá receber e desserializar seus objetos.Um exemplo no artigo Soquetes do windows: A ordenação de bytes mostra a comunicação desse tipo.

Especificação de soquetes do windows de Para obter mais informações, consulte: htonl, htons, ntohl, ntohs. Além disso, para obter mais informações, consulte:

Consulte também

Referência

CArchive::IsStoring

CArchive::operator <<

CArchive::operator >>

CArchive::Flush

CObject::Serialize

Conceitos

Windows Sockets em MFC