Compartilhar via


Soquetes do Windows: usando a classe CAsyncSocket

Este 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 sacrificar a flexibilidade. Você também pode sentir que consegue obter melhor eficiência programando diretamente as comunicações, mais do que usando o modelo de classe alternativo mais geral CSocket.

CAsyncSocket está documentado na Referência do MFC. O Visual C++ também fornece a especificação de Soquetes do Windows, localizada no SDK do Windows. Os detalhes são deixados para você. O Visual C++ não fornece um aplicativo de exemplo para CAsyncSocket.

Se você não tiver muito conhecimento sobre comunicações de rede e quiser uma solução simples, use a classe CSocket com um CArchive objeto. Consulte Os Soquetes do Windows: usando soquetes com arquivos para obter mais informações.

Este artigo abrange:

Como criar e usar um CAsyncSocket

Para usar CAsyncSocket

  1. Construa um CAsyncSocket objeto e use o objeto para criar o identificador SOCKET subjacente.

    A criação de um soquete segue o padrão MFC de construção de dois estágios.

    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 Create chamada acima usa os parâmetros padrão para criar um soquete de fluxo. A segunda Create chamada cria um soquete de datagrama com uma porta e um endereço especificados. (Você pode usar qualquer Create versão com qualquer um dos métodos de construção.)

    Os parâmetros para Create são:

    • Uma "porta": um inteiro curto.

      Para um soquete de servidor, você deve especificar uma porta. Para um soquete de cliente, normalmente você 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 (Protocolo de Internet) 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 socket 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 Accept função membro usa uma referência a um novo objeto vazio CSocket 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 obter um exemplo, consulte o artigo Windows Sockets: Sequence of Operations.

  3. Realize comunicações com outros sockets chamando as funções membro do objeto CAsyncSocket que encapsulam as funções da API de Sockets do Windows.

    Consulte a especificação e a classe CAsyncSocket do Windows Sockets na Referência do MFC.

  4. Destrua o CAsyncSocket objeto.

    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 obter um exemplo dessa sequência no código (na verdade, para um CSocket objeto), consulte Os Soquetes do Windows: Sequência de Operações.

Suas responsabilidades com CAsyncSocket

Quando você cria um objeto de classe CAsyncSocket, o objeto encapsula um handle do Windows SOCKET e fornece operações nesse handle. 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 obter definições desses termos e informações adicionais, consulte Os Soquetes do Windows: Bloqueio, Soquetes do Windows: Ordenação de Bytes, Soquetes do Windows: Convertendo 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 obter mais informações, consulte:

Consulte também

Soquetes do Windows no MFC