Compartilhar via


Windows Sockets: usando soquetes com arquivos mortos

Este artigo descreve o modelo de programação CSocket. A classe CSocket fornece suporte ao soquete em um nível mais alto de abstração do que a classe CAsyncSocket. O CSocket usa uma versão do protocolo de serialização MFC para passar dados de e para um objeto de soquete por meio de um objeto CArchive do MFC. O CSocket fornece bloqueio (ao gerenciar o processamento em segundo plano de mensagens do Windows) e fornece a você acesso ao CArchive, que gerencia muitos aspectos da comunicação que você teria que fazer por conta própria usando a API bruta ou a classe CAsyncSocket.

Dica

Você pode usar a classe CSocket sozinha, como uma versão mais conveniente de CAsyncSocket, mas o modelo de programação mais simples é usar CSocket com um objeto CArchive.

Para obter mais informações sobre como funciona a implementação de soquetes com arquivos mortos, consulte Windows Sockets: como os soquetes funcionam com arquivos mortos. Para um código de exemplo, consulte Windows Sockets: Sequência de Operações e Windows Sockets: exemplo de soquetes usando arquivos mortos. Para obter informações sobre algumas das funcionalidades que você pode obter derivando suas próprias classes das classes de soquetes, consulte Windows Sockets: Derivar das Classes de Soquete.

Observação

Se você estiver escrevendo um programa cliente MFC para se comunicar com servidores estabelecidos (não MFC), não envie objetos C++ por meio do arquivo. A menos que o servidor seja um aplicativo MFC que entenda os tipos de objetos que você deseja enviar, ele não conseguirá receber e desserializar seus objetos. Para obter material relacionado ao assunto da comunicação com aplicativos que não sejam MFC, consulte também o artigo Windows Sockets: Ordem de byte.

O modelo de programação CSocket

O uso de um objeto CSocket envolve criar e associar vários objetos de classe MFC. No procedimento geral abaixo, cada etapa é executada pelo soquete do servidor e pelo soquete do cliente, exceto na etapa 3, na qual cada tipo de soquete requer uma ação diferente.

Dica

Em tempo de execução, o aplicativo servidor geralmente começa a ficar pronto e "escutar" quando o aplicativo cliente busca uma conexão. Se o servidor não estiver pronto quando o cliente tentar se conectar, você normalmente exigirá que o aplicativo de usuário tente se conectar novamente mais tarde.

Para configurar a comunicação entre um soquete de servidor e um soquete de cliente

  1. Construa um objeto CSocket.

  2. Use o objeto para criar o identificador SOCKET subjacente.

    Para um objeto de cliente CSocket, normalmente você deve usar os parâmetros padrão para Criar, a menos que precise de um soquete de datagrama. Para um objeto de servidor CSocket, você deve especificar uma porta na chamada Create.

    Observação

    O CArchive não funciona com soquetes de datagrama. Se você quiser usar CSocket para um soquete de datagrama, deverá usar a classe como usaria CAsyncSocket, ou seja, sem um arquivo morto. Como os datagramas não são confiáveis (não é garantido que cheguem e podem estar repetidos ou fora de sequência), eles não são compatíveis com a serialização por meio de um arquivo morto. Espera-se que uma operação de serialização seja concluída de forma confiável e em sequência. Se você tentar usar CSocket com um objeto CArchive para um datagrama, uma declaração MFC falhará.

  3. Se o soquete for um cliente, chame CAsyncSocket::Connect para conectar o objeto de soquete a um soquete do servidor.

    -ou-

    Se o soquete for um servidor, chame CAsyncSocket::Listen para começar a escutar as tentativas de conexão de um cliente. Ao receber uma solicitação de conexão, aceite-a chamando CAsyncSocket::Accept.

    Observação

    A função membro Accept faz uma referência a um novo objeto CSocket vazio como seu parâmetro. Você deve construir esse objeto antes de chamar Accept. Se esse objeto de soquete ficar fora do escopo, a conexão será fechada. Não chame Create para esse novo objeto de soquete.

  4. Crie um objeto CSocketFile, associando o objeto CSocket a ele.

  5. Crie um objeto CArchive para carregar (receber) ou armazenar (enviar) dados. O arquivo morto está associado ao objeto CSocketFile.

    Tenha em mente que CArchive não funciona com soquetes de datagrama.

  6. Use o objeto CArchive para passar dados entre os soquetes do cliente e do servidor.

    Tenha em mente que um determinado objeto CArchive move dados apenas em uma direção: seja para carregar (receber) ou armazenar (enviar). Em alguns casos, você usará dois objetos CArchive: um para enviar dados e outro para receber confirmações.

    Depois de aceitar uma conexão e configurar o arquivo morto, você pode executar tarefas como validar senhas.

  7. Destrua o arquivo morto, o arquivo de soquete e os objetos de soquete.

    Observação

    A classe CArchive fornece a função membro IsBufferEmpty especificamente para uso com a classe CSocket. Se, por exemplo, o buffer contiver várias mensagens de dados, você precisará fazer loop até que todas elas sejam lidas e o buffer seja limpo. Caso contrário, sua próxima notificação de que há dados a serem recebidos poderá ser adiada indefinidamente. Use IsBufferEmpty para garantir que você recupere todos os dados.

O artigo Windows Sockets: sequência de operações ilustra ambos os lados desse processo com código de exemplo.

Para saber mais, veja:

Confira também

Windows Sockets em MFC
CSocket::Create