Partilhar via


Windows Sockets: Usando soquetes com arquivos de dados

Este artigo descreve o modelo de programação CSocket. A classe CSocket fornece suporte a 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 através de um objeto MFC CArchive . CSocket fornece bloqueio (enquanto gerencia o processamento em segundo plano de mensagens do Windows) e dá acesso ao CArchive, que gerencia muitos aspetos da comunicação que você teria que fazer sozinho usando a API bruta ou a classe CAsyncSocket.

Sugestão

Você pode usar a classe CSocket por si só, 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, consulte Windows Sockets: How Sockets with Archives Work. Para obter um código de exemplo, consulte Windows Sockets: Sequence of Operations e Windows Sockets: Example of Sockets Using Archives. Para obter informações sobre algumas das funcionalidades que você pode obter derivando suas próprias classes das classes de soquetes, consulte Windows Sockets: Derivando de 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++ através do arquivo. A menos que o servidor seja um aplicativo MFC que compreenda 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 Windows Sockets: Byte Ordering.

O modelo de programação 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 a etapa 3, na qual cada tipo de soquete requer uma ação diferente.

Sugestão

Em tempo de execução, o aplicativo de servidor geralmente começa primeiro para estar pronto e "escutando" quando o aplicativo cliente procura uma conexão. Se o servidor não estiver pronto quando o cliente tentar se conectar, você normalmente exigirá que o aplicativo do 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. Utilize o objeto para criar o manipulador SOCKET subjacente.

    Para um CSocket objeto cliente, você normalmente 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, você deve usar a classe como você usaria CAsyncSocket, ou seja, sem um arquivo. Como os datagramas não são confiáveis (não é garantido que cheguem e podem ser repetidos ou fora de sequência), eles não são compatíveis com a serialização através de um arquivo. 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 datagrama, uma asserção MFC falhará.

  3. Se o soquete for um cliente, chame CAsyncSocket::Connect para conectar o objeto de soquete 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 member usa uma referência a um novo objeto vazio CSocket como parâmetro. Você deve construir este objeto antes de chamar Accept. Se esse objeto de soquete sair do escopo, a conexão será fechada. Não chame Create 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 não funciona com soquetes de datagrama.

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

    Lembre-se de que um determinado CArchive objeto move os dados em uma única direção: para carregamento (recebimento) ou armazenamento (envio). Em alguns casos, você usará dois CArchive objetos: um para enviar dados, o outro para receber confirmações.

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

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

    Observação

    Class CArchive fornece a função membro IsBufferEmpty especificamente para uso com a classe CSocket. Se o buffer contiver várias mensagens de dados, por exemplo, você precisará fazer um 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 pode 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:

Ver também

Windows Sockets no MFC
CSocket::Criar