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
Construa um objeto CSocket.
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 servidorCSocket
, você deve especificar uma porta na chamadaCreate
.Observação
O
CArchive
não funciona com soquetes de datagrama. Se você quiser usarCSocket
para 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 é 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 usarCSocket
com um objetoCArchive
para um datagrama, uma declaração MFC falhará.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 objetoCSocket
vazio como 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 chameCreate
para esse novo objeto de soquete.Crie um objeto CSocketFile, associando o objeto
CSocket
a ele.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.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 objetosCArchive
: 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
CArchive
fornece a função membroIsBufferEmpty
especificamente para uso com a classeCSocket
. 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. UseIsBufferEmpty
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: