Windows Sockets: usando soquetes com arquivos mortos
Este artigo descreve Modelo de programação de CSocket. A classe CSocket fornece suporte de soquete em um nível mais alto de abstração de que classifica CAsyncSocket. CSocket usa uma versão do protocolo de serialização MFC para transmitir dados de e para um objeto de soquete por meio de um objeto MFC CArchive . CSocket fornece o bloqueio (para gerenciar o processamento em segundo plano de mensagens do windows) e fornece acesso a CArchive, que gerencia muitos aspectos da comunicação que você teria que se tornar usando a API bruto ou classificar CAsyncSocket.
Dica
Você pode usar a classe CSocket por si só, como uma versão mais conveniente de CAsyncSocket, mas o modelo mais simples de programação é usar CSocket com um objeto de CArchive .
Para obter mais informações sobre como a implementação de soquetes com arquivos mortos funciona, consulte Windows Sockets: como funcionam soquetes com arquivos mortos. Por exemplo, o código Windows Sockets: sequência de operações consulte e Windows Sockets: exemplo de soquetes que usam arquivos mortos. Para obter informações sobre algumas das funcionalidades que você pode obter com suas próprias classes das classes de soquetes, consulte Windows Sockets: derivando de classes de soquete.
Dica
Se você estiver escrevendo um programa cliente MFC para se comunicar com os servidores (não) MFC estabelecidas, não enviar objetos C++ por meio do arquivo morto.A menos que o servidor é um aplicativo de MFC que compreende os tipos de objetos você deseja enviar, não poderá receber e desserializar seus objetos.Para material relacionado ao propósito da comunicação com os aplicativos não MFC também, consulte o artigo Windows Sockets: ordenação de bytes.
O modelo de programação de CSocket
Usar um objeto de CSocket envolve a criação e associar vários objetos juntos MFC da classe. No procedimento em geral, cada etapa é executada por soquete de servidor e por soquete de cliente, com exceção da etapa 3, em que cada tipo de soquete requer uma ação diferente.
Dica
Em tempo de execução, o aplicativo para servidores normalmente inicia primeiro e pronto para ser “escutando” quando o aplicativo cliente pesquisa uma conexão.Se o servidor não está pronto quando o cliente tentar se conectar, você normalmente requer o aplicativo de usuário tentar se conectar novamente mais tarde.
Para configurar a comunicação entre um soquete de servidor e um soquete de cliente
Construir um objeto de CSocket .
Use o objeto para criar o identificador de SOCKET subjacente.
Para um objeto de cliente de CSocket , você normalmente deve usar os parâmetros padrão a Crie, a menos que você precise de um soquete de datagrama. Para um objeto de servidor de CSocket , você deve especificar uma porta na chamada de Criar .
Dica
CArchive não funciona com soquetes de datagrama.Se você quiser usar CSocket para um soquete de datagrama, você deve usar a classe porque você usaria CAsyncSocket, isto é, sem um arquivo morto.Como as datagramas são não confiável (não garantido para chegar e pode ser repetidas ou fora de sequência), não são compatíveis com a serialização meio de um arquivo morto.Você espera que uma operação de serialização concluir o e na ordem.Se você tentar usar CSocket com um objeto de CArchive para uma datagrama, uma asserção de MFC falha.
Se o soquete é um cliente, chame CAsyncSocket::Connect para conectar o objeto de soquete a um soquete do servidor.
- ou -
Se o soquete é um servidor, chame CAsyncSocket::Listen para iniciar a escuta se conecta tentativas de um cliente. Após o recebimento de uma solicitação de conexão, aceitar-la chamando CAsyncSocket::Accept.
Dica
A função de membro de Aceitar usa uma referência a um novo objeto vazio, de CSocket como o parâmetro.Você deve construir esse objeto antes de chamar Aceitar.Se esse objeto de soquete sair do escopo, a conexão é fechada.Não chame Criar para esse novo objeto de soquete.
Crie um objeto de CSocketFile , associando o objeto de CSocket a ele.
Crie um objeto de CArchive para a carga (pull) ou armazenar dados (enviar). O arquivo morto está associado ao objeto de CSocketFile .
Lembre-se de que CArchive não funciona com soquetes de datagrama.
Use o objeto de CArchive para passar dados entre o cliente e soquetes do servidor.
Lembre-se de que um determinado objeto de CArchive move dados em uma direção apenas: para carregar (pull) ou armazenar enviar (). Em alguns casos, você usará dois objetos de CArchive : um para enviar dados, outro para receber confirmações.
Após aceito uma conexão e configurado o arquivo, você pode executar tarefas como validando senhas.
Destruir o arquivo, o arquivo de soquete, e os objetos de soquete.
Dica
Classifica fontes de CArchive a função de membro de IsBufferEmpty especificamente para uso com CSocketclasse.Se o buffer contém várias mensagens de dados, por exemplo, você precisa executar um loop até que todo sejam lidos e o buffer estiver desmarcada.Se não, sua próxima notificação que há dados a serem recebidos indefinidamente pode ser adiada.Use IsBufferEmpty para assegurar que você recupera todos os dados.
O artigo Windows Sockets: sequência de operações ilustra os dois lados desse processo com o código de exemplo.
Para obter mais informações, consulte: