Compartilhar via


Windows Sockets: Exemplo de soquetes de segurança usando arquivos

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

O exemplo a seguir ilustra como você usar o arquivar para enviar e receber dados por meio de CSocket objetos. O exemplo foi projetado de tal forma que duas instâncias do aplicativo (na mesma computador ou em máquinas diferentes na rede) trocam dados.Uma instância envia dados, o que a Outros instância recebe e reconhece.O aplicativo pode iniciar um intercâmbio e qualquer um pode atuar sistema autônomo servidor ou cliente para o Outros 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();
      }
    }
}

O mais importante sobre este exemplo é que sua estrutura paralela que um MFC Serialize função. The PacketSerialize função de membro consiste em um Se demonstrativo com um else cláusula.A função recebe dois CArchive referências sistema autônomo parâmetros: arData e arAck.Se o arData objeto arquivar está definido para armazenar (Enviar) a Se ramificar executa; caso contrário, se arData está definido para carregar (recebimento) a função usa o else ramificar.Para obter mais informações sobre a serialização no MFC, consulte Serialização.

Observação:

O arAck objeto de arquivar será considerado o oposto de arData. If arData é para enviar, arAck receber, e o inverso é verdadeiro.

Para enviar, a função de exemplo faz um loop por um número especificado de vezes, sempre gerar alguns dados aleatórios para fins de demonstração.Seu aplicativo obteria real de dados de fonte, sistema autônomo um arquivo.The arData (operador) inserção do arquivar**<<**) é usado para enviar um fluxo de três blocos consecutivos de dados:

  • "Cabeçalho" que especifica a natureza dos dados (nesse caso, o valor dabValue 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.

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

  • Uma seqüência de caracteres denominada strText que o receptor exibirá seu usuário.

Para recebimento, a função opera da mesma forma, exceto que ele usa o operador de extração do arquivar (>>) Para obter dados do arquivar.O aplicativo receptor verifica os dados que recebe, exibe a mensagem de "Recebimento" final e, em seguida, envia de volta uma mensagem que diz "Enviado" para o aplicativo de envio exibir.

Nesse modelo de comunicação, a palavra "Recebimento", a mensagem enviada nastrText variável, é para exibição na Outros extremidade da comunicação, portanto, ele 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.Recebimento de ambas as seqüências de caracteres indica que a comunicação bem-sucedida tenha ocorrido.

Cuidado:

Se você um re escrever um programa do cliente MFC para se comunicar com estabelecida (não-MFC) servidores, não envie objetos C++ por meio do arquivar.A menos que o servidor seja um aplicativo MFC que entende os tipos de objetos você deseja para enviar, não será possível receber e desserializar os objetos.Um exemplo do artigo Windows Sockets: byte pedidos mostra uma comunicação desse tipo.

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

Consulte também

Conceitos

Windows Sockets no MFC

Referência

CArchive::IsStoring

CArchive::operador <<

CArchive::operador >>

CArchive::Flush

CObject::Serialize