Partilhar via


Windows Sockets: Exemplo de Sockets usando arquivos

Este artigo apresenta um exemplo de como usar a classe CSocket.O exemplo utiliza CArchive objetos para serializar os dados através de um soquete.Observe que isso não é serialização de documento ou para um arquivo.

O exemplo a seguir ilustra como usar o arquivamento para enviar e receber dados por meio de CSocket objetos.O exemplo foi projetado para que duas instâncias do aplicativo (na mesma máquina ou em máquinas diferentes na rede) de dados do exchange.Uma instância envia dados, que a outra instância recebe e reconhece.O aplicativo pode iniciar um intercâmbio e qualquer um pode atuar como servidor ou cliente para o outro aplicativo.A função a seguir é definida na classe de modo de exibição do 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 coisa mais importante sobre este exemplo é que sua estrutura é semelhante ao de um MFC Serialize função.O PacketSerialize função de membro consiste em uma se instrução com um outra cláusula.A função recebe dois CArchive referências como parâmetros: arData e arAck.Se o arData arquivo objeto é definido para armazenar (envio), o se filial executa; Caso contrário, se arData está definido para carregar (recebimento) tem a função de outra filial.Para obter mais informações sobre serialização no MFC, consulte serialização.

ObservaçãoObservação

O arAck o objeto de arquivamento é considerado o oposto do arData.Se arData é para enviar, arAck recebe, e o inverso é verdadeiro.

Para enviar, a função de exemplo faz um loop para um número especificado de vezes, cada vez que gerar alguns dados aleatórios para fins de demonstração.Seu aplicativo seria obter dados reais de origem, como um arquivo.O arData operador de inserção do arquivamento (<<) é usado para enviar um fluxo de três blocos consecutivos de dados:

  • "Cabeçalho" que especifica a natureza dos dados (nesse caso, o valor de bValue variável e quantas cópias serão enviadas).

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

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

    Interno para loop envia bValue o número de vezes especificado.

  • Uma seqüência de caracteres chamado strText que o receptor exibe para o usuário.

Para receber, a função funciona da mesma forma, exceto que ele usa o operador de extração do arquivo (>>) para obter dados de arquivamento.O aplicativo de recebimento verifica os dados que recebe, exibe a mensagem "Recebido" final e envia uma mensagem que diz "Enviados" para o aplicativo de envio exibir.

Nesse modelo de comunicação, a palavra "Recebido", a mensagem enviada na strText variável, é para exibição no final da comunicação, portanto, especifica para o usuário receber um determinado número de pacotes de dados foram recebidos.O receptor responde com uma seqüência de caracteres semelhante que diz "Enviado" para exibição na tela do remetente original.Confirmação de duas seqüências de caracteres indica que a comunicação bem-sucedida ocorreu.

Observação de cuidadoCuidado

Se você estiver escrevendo um programa cliente do MFC para se comunicar com servidores estabelecida (não-MFC), não envie objetos C++ através do arquivamento.A menos que o servidor é um aplicativo do MFC que entende os tipos de objetos que você deseja enviar, não será capaz de receber e desserializar objetos.Um exemplo no artigo Windows Sockets: Byte ordem mostra uma comunicação desse tipo.

Para obter mais informações, consulte especificação do Windows Sockets: htonl, htons, ntohl, ntohs.Para obter mais informações, consulte também:

Consulte também

Referência

CArchive::IsStoring

CArchive::operator <<

CArchive::operator >>

CArchive::Flush

CObject::Serialize

Conceitos

Windows Sockets no MFC