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 CAsyncSocket

Para usar CAsyncSocket

  1. Construa um objeto CAsyncSocket e use o objeto para criar o identificador SOCKET 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 um CAsyncSocket no heap. A primeira chamada a Create acima usa os parâmetros padrão para criar um soquete de fluxo. A segunda chamada a Create cria um soquete de datagrama com uma porta e um endereço especificados. (Você pode usar qualquer versão de Create 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) ou SOCK_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.

  2. 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 com CAsyncSocket::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 objeto CSocket vazio como seu parâmetro. Você deve construir esse objeto antes de chamar Accept. Se esse objeto de soquete ficar fora do escopo, a conexão será fechada. Não chame Create para novo objeto de soquete. Para um exemplo, confira o artigo Windows Sockets: sequência de operações.

  3. 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.

  4. 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 operador delete 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:

Confira também

Windows Sockets em MFC