Partilhar via


Windows Sockets: 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 destina-se a programadores que conhecem detalhadamente as comunicações de rede, mas que querem a conveniência dos callbacks 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 é possível obter melhor eficiência programando as comunicações de forma mais direta do que poderia ao usar o modelo da classe alternativa mais geral CSocket.

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

Se você não tem um grande conhecimento sobre comunicações de rede e deseja uma solução simples, use a classe CSocket com um CArchive objeto. Consulte Windows Sockets: Usando soquetes com arquivos para obter mais informações.

Este artigo abrange:

Criando e usando um CAsyncSocket

Para utilizar CAsyncSocket

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

    A criação de um soquete segue o padrão MFC de construção em 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 mencionado 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 número 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, que permite que o Windows Sockets selecione 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".

      Este é o seu endereço IP (Internet Protocol) na rede. Você provavelmente sempre confiará no valor padrão para esse parâmetro.

    Os termos "porta" e "endereço de soquete" são explicados em Windows Sockets: Ports and Socket Addresses.

  2. Se o soquete for um cliente, conecte o objeto de soquete a um soquete de servidor, usando CAsyncSocket::Connect.

    -ou-

    Se o soquete for um servidor, configure o soquete para começar a escutar (com CAsyncSocket::Listen) as 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 fazer tarefas como validar senhas.

    Observação

    A Accept função member usa uma referência a um novo objeto vazio CSocket como parâmetro. Você deve construir este objeto antes de chamar Accept. Se esse objeto de soquete sair do escopo, a conexão será fechada. Não chame Create para este novo objeto socket. Para obter um exemplo, consulte o artigo Windows Sockets: Sequence of Operations.

  3. Efetue comunicações com outros soquetes chamando os métodos do objeto CAsyncSocket que encapsulam as funções da API do Windows Sockets.

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

  4. Destrua o CAsyncSocket objeto.

    Se criaste o objeto de soquete na pilha, o seu destrutor é chamado quando a função que o contém sai do escopo. Se criou o objeto de soquete no heap, usando o operador new, é responsável por usar o operador delete para destruir o objeto.

    O destruidor chama a função de membro Close do objeto antes de destruí-lo.

Para obter um exemplo dessa sequência no código (na verdade, para um CSocket objeto), consulte Windows Sockets: Sequence of Operations.

As suas responsabilidades com CAsyncSocket

Quando você cria um objeto de classe CAsyncSocket, o objeto encapsula um identificador do Windows SOCKET e fornece operações nesse identificador. Ao usar CAsyncSocket, deverá lidar com todos os problemas que poderá enfrentar ao utilizar a API diretamente. Por exemplo:

  • Cenários de "bloqueio".

  • Diferenças de ordem de bytes entre as máquinas de envio e de receção.

  • Conversão entre cadeias de caracteres Unicode e MBCS (conjunto de caracteres multibyte).

Para obter definições desses termos e informações adicionais, consulte Windows Sockets: Blocking, Windows Sockets: Byte Ordering, Windows Sockets: Converting Strings.

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ê: ele bombeia mensagens do Windows durante o bloqueio de chamadas e lhe dá acesso ao CArchive, que gerencia as diferenças de ordem de bytes e conversão de cadeia de caracteres para você.

Para obter mais informações, consulte:

Ver também

Windows Sockets no MFC