Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
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
Construir um objeto CSocket .
Use o objeto para criar a alça SOCKET subjacente.
Para um
CSocketobjeto cliente, normalmente você deve usar os parâmetros padrão para Criar, a menos que precise de um soquete de datagrama. Para umCSocketobjeto de servidor, você deve especificar uma porta naCreatechamada.Observação
CArchivenão funciona com soquetes de datagrama. Se você quiser usarCSocketpara um soquete de datagrama, deverá usar a classe como usariaCAsyncSocket, 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 usarCSocketcom umCArchiveobjeto para um datagram, uma declaração MFC falhará.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
Acceptfunção membro usa uma referência a um novo objeto vazioCSocketcomo seu parâmetro. Você deve construir esse objeto antes de chamarAccept. Se esse objeto de soquete ficar fora do escopo, a conexão será fechada. Não chameCreatepara esse novo objeto de soquete.Crie um objeto CSocketFile , associando o
CSocketobjeto a ele.Crie um objeto CArchive para carregar (receber) ou armazenar (enviar) dados. O arquivo está associado ao
CSocketFileobjeto.Tenha em mente que
CArchiveisso não funciona com soquetes de datagrama.Use o
CArchiveobjeto para passar dados entre os soquetes do cliente e do servidor.Tenha em mente que um determinado
CArchiveobjeto move dados apenas em uma direção: para carregar (receber) ou armazenar (enviar). Em alguns casos, você usará doisCArchiveobjetos: 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.
Destrua o arquivo morto, o arquivo de soquete e os objetos de soquete.
Observação
A classe
CArchivefornece aIsBufferEmptyfunção membro especificamente para uso com a classeCSocket. 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. UseIsBufferEmptypara 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: