Compartilhar via


Aceitando uma conexão (Soquetes do Windows 2)

Depois que o soquete estiver escutando uma conexão, o programa deverá lidar com solicitações de conexão nesse soquete.

Para aceitar uma conexão em um soquete

  1. Crie um objeto de SOCKET temporário chamado ClientSocket para aceitar conexões de clientes.

    
    SOCKET ClientSocket;
    
    
    
  2. Normalmente, um aplicativo de servidor seria projetado para escutar conexões de vários clientes. Para servidores de alto desempenho, vários threads geralmente são usados para lidar com as várias conexões de cliente.

    Há várias técnicas de programação diferentes usando Winsock que podem ser usadas para escutar várias conexões de cliente. Uma técnica de programação é criar um loop contínuo que verifica solicitações de conexão usando a função listen (consulte Escutando em um soquete). Se ocorrer uma solicitação de conexão, o aplicativo chamará a função aceitar, a função AcceptEx, ou a função WSAAccept, e passará o trabalho para outra thread para lidar com a solicitação. Várias outras técnicas de programação são possíveis.

    Observe que este exemplo básico é muito simples e não usa vários threads. O exemplo também apenas escuta e aceita apenas uma única conexão.

    
    ClientSocket = INVALID_SOCKET;
    
    // Accept a client socket
    ClientSocket = accept(ListenSocket, NULL, NULL);
    if (ClientSocket == INVALID_SOCKET) {
        printf("accept failed: %d\n", WSAGetLastError());
        closesocket(ListenSocket);
        WSACleanup();
        return 1;
    }
    
    
    
  3. Quando a conexão do cliente for aceita, um aplicativo de servidor normalmente passaria o soquete do cliente aceito (a variável ClientSocket no código de exemplo acima) para um thread de trabalho ou uma porta de conclusão de E/S e continuaria aceitando conexões adicionais. Neste exemplo básico, o servidor continua para a próxima etapa.

    Há várias outras técnicas de programação que podem ser usadas para escutar e aceitar várias conexões. Elas incluem o uso das funções select ou WSAPoll. Exemplos de algumas dessas várias técnicas de programação são ilustrados nas Amostras Avançadas do Winsock incluídas no Microsoft Windows Software Development Kit (SDK).

    Nota

    Em sistemas Unix, uma técnica de programação comum para servidores era que um aplicativo escutasse conexões. Quando uma conexão era aceita, o processo pai chamava a função fork para criar um novo processo filho para lidar com a conexão do cliente, herdando o soquete do pai. Não há suporte para essa técnica de programação no Windows, pois não há suporte para a função de bifurcação . Essa técnica também geralmente não é adequada para servidores de alto desempenho, pois os recursos necessários para criar um novo processo são muito maiores do que os necessários para um thread.

Depois que a função aceitar for chamada, a ListenSocket não será mais necessária para este exemplo. A função closesocket é chamada para fechar o soquete.

    // No longer need server socket
    closesocket(ListenSocket);

Próxima etapa: recebimento e envio de dados no servidor

introdução ao winsock

Aplicativo do Servidor Winsock

Escutando em um soquete