Windows Sockets: como usar a classe CAsyncSocket
Esse artigo explica como usar a classe CAsyncSocket
. Essa classe encapsula a API do Windows Sockets em um nível muito baixo. CAsyncSocket
é para uso por programadores que conhecem as comunicações de rede em detalhes, mas querem a conveniência dos retornos de chamada para notificação de eventos de rede. Com base nessa suposição, este artigo fornece apenas instruções básicas. Você provavelmente deve considerar usar CAsyncSocket
se quiser a facilidade do Windows Sockets de lidar com vários protocolos de rede em um aplicativo MFC, mas não quiser prejudicar a flexibilidade. Você também pode sentir que pode obter melhor eficiência programando as comunicações mais diretamente do que usando o modelo alternativo mais geral de classe CSocket
.
CAsyncSocket
está documentado na Referência do MFC. O Visual C++ também fornece a especificação do Windows Sockets, localizada no SDK do Windows. Os detalhes ficam para você. O Visual C++ não fornece um aplicativo de exemplo para CAsyncSocket
.
Se você não tiver conhecimento sobre comunicações de rede e quiser uma solução simples, use a classe CSocket
com um objeto CArchive
. Confira o Windows Sockets: como usar soquetes com arquivos para mais informações.
Este artigo cobre:
Como criar e usar um objeto
CAsyncSocket
.
Como criar e usar um CAsyncSocket
Para usar CAsyncSocket
Construa um objeto
CAsyncSocket
e use o objeto para criar o identificadorSOCKET
subjacente.A criação de um soquete segue o padrão MFC de construção em duas fases.
Por exemplo:
CAsyncSocket sock; sock.Create(); // Use the default parameters
-ou-
CAsyncSocket *pSocket = new CAsyncSocket; int nPort = 27; pSocket->Create(nPort, SOCK_DGRAM);
O primeiro construtor acima cria um objeto
CAsyncSocket
na pilha. O segundo construtor cria umCAsyncSocket
no heap. A primeira chamada aCreate
acima usa os parâmetros padrão para criar um soquete de fluxo. A segunda chamada aCreate
cria um soquete de datagrama com uma porta e um endereço especificados. (Você pode usar qualquer versão deCreate
com qualquer um dos métodos de construção.)Os parâmetros a
Create
são:Uma "porta": um inteiro curto.
Para um soquete de servidor, você deve especificar uma porta. Para um soquete de cliente, você normalmente aceita o valor padrão para esse parâmetro, o que permite que os Soquetes do Windows selecionem uma porta.
Um tipo de soquete:
SOCK_STREAM
(o padrão) ouSOCK_DGRAM
.Um "endereço" de soquete, como
"ftp.microsoft.com"
ou"128.56.22.8"
.Esse é o endereço IP (Internet Protocol) na rede. Você provavelmente sempre dependerá do valor padrão para esse parâmetro.
Os termos "porta" e "endereço de soquete" são explicados em Soquetes do Windows: portas e endereços de soquete.
Se o soquete for um cliente, conecte o objeto soquete a um soquete de servidor usando
CAsyncSocket::Connect
.-ou-
Se o soquete for um servidor, defina o soquete para começar a escutar (com
CAsyncSocket::Listen
) para tentativas de conexão de um cliente. Ao receber uma solicitação de conexão, aceite-a comCAsyncSocket::Accept
.Depois de aceitar uma conexão, você pode realizar tarefas como validar senhas.
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 novo objeto de soquete. Para um exemplo, confira o artigo Windows Sockets: sequência de operações.Execute comunicações com outros soquetes chamando as funções de membro do objeto
CAsyncSocket
que encapsulam as funções da API do Windows Sockets.Confira a especificação e a classe
CAsyncSocket
do Windows Sockets na Referência do MFC.Destrua o objeto
CAsyncSocket
.Se você criou o objeto socket na pilha, seu destruidor será chamado quando a função de contenção sair do escopo. Se você criou o objeto socket no heap, usando o operador
new
, será responsável por usar o operadordelete
para destruir o objeto.O destruidor chama a função membro do objeto
Close
antes de destruir o objeto.
Para um exemplo dessa sequência no código (na verdade, para um CSocket
objeto), confira Windows Sockets: sequência de operações.
Suas responsabilidades com CAsyncSocket
Quando você cria um objeto de classe CAsyncSocket
, o objeto encapsula um identificador SOCKET
do Windows e fornece operações nesse identificador. Ao usar CAsyncSocket
, você deve lidar com todos os problemas que poderá enfrentar se estiver usando a API diretamente. Por exemplo:
Cenários de "bloqueio".
Diferenças de ordem de byte entre os computadores de envio e recebimento.
Converter entre cadeias de caracteres Unicode e MBCS (conjunto de caracteres multibyte).
Para definições desses termos e informações adicionais, confira Windows Sockets: bloqueio, Windows Sockets: ordenação de byte, Windows Sockets: como converter cadeias de caracteres.
Apesar desses problemas, a classe CAsyncSocket
pode ser a escolha certa para você se seu aplicativo exigir toda a flexibilidade e controle que você pode obter. Caso contrário, considere usar a classe CSocket
em vez disso. CSocket
oculta muitos detalhes de você: bombeia mensagens do Windows durante o bloqueio de chamadas e dá acesso a CArchive
, o que gerencia diferenças de ordem de byte e conversão de cadeia de caracteres para você.
Para saber mais, veja:
- Windows Sockets: contexto\
- Windows Sockets: soquetes de fluxo\
- Windows Sockets: soquetes de datagrama