Compartilhar via


Soquetes do Windows: usando soquetes com arquivos

Este artigo descreve o modelo de programação do CSocket. A classe CSocket fornece suporte ao soquete em um nível mais alto de abstração do que a classe CAsyncSocket. 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 MFC. CSocket fornece bloqueio (ao gerenciar o processamento em segundo plano de mensagens do Windows) e fornece acesso a CArchivevocê, 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 por si só, como uma versão mais conveniente, mas o modelo de CAsyncSocketprogramação mais simples é usar CSocket com um CArchive objeto.

Para obter mais informações sobre como funciona a implementação de soquetes com arquivos, consulte Soquetes do Windows: Como funcionam soquetes com arquivos. Por exemplo, código, consulte Os Soquetes do Windows: sequência de operações e soquetes do Windows: exemplo de soquetes usando arquivos. Para obter informações sobre algumas das funcionalidades que você pode obter derivando suas próprias classes das classes de soquetes, consulte Os Soquetes do Windows: Derivando 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 morto. A menos que o servidor seja um aplicativo MFC que entenda os tipos de objetos que você deseja enviar, ele não poderá receber e desserializar seus objetos. Para obter material relacionado sobre o assunto da comunicação com aplicativos não MFC, consulte também o artigo Soquetes do Windows: Ordenação de Bytes.

O modelo de programação do CSocket

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

Dica

Em tempo de execução, o aplicativo de servidor geralmente começa a estar pronto e "escutando" 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 cliente

  1. Construir um objeto CSocket .

  2. Use o objeto para criar a alça SOCKET subjacente.

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

    Observaçã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 tem garantia de chegar e podem ser repetidos ou fora de sequência), eles não são compatíveis com a serialização por meio de um arquivo morto. Você espera 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 CArchive objeto para um datagram, uma declaração MFC falhará.

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

    - ou -

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

    Observação

    A Accept função membro usa uma referência a um novo objeto vazio CSocket 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 CSocket objeto a ele.

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

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

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

    Tenha em mente que um determinado CArchive objeto move dados apenas em uma direção: para carregar (receber) ou armazenar (enviar). Em alguns casos, você usará dois CArchive objetos: 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 IsBufferEmpty função membro especificamente para uso com a classe CSocket. Se o buffer contiver várias mensagens de dados, por exemplo, 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: Sequence of Operations ilustra ambos os lados desse processo com código de exemplo.

Para obter mais informações, consulte:

Consulte também

Soquetes do Windows no MFC
CSocket::Create