Aceitando uma conexão (Windows Sockets 2)
Uma vez que o soquete está escutando uma conexão, o programa deve lidar com solicitações de conexão nesse soquete.
Para aceitar uma conexão em um soquete
Crie um objeto temporário SOCKET chamado ClientSocket para aceitar conexões de clientes.
SOCKET ClientSocket;
Normalmente, um aplicativo de servidor seria projetado para escutar conexões de vários clientes. Para servidores de alto desempenho, vários threads são comumente usados para lidar com várias conexões de cliente.
Existem várias técnicas de programação diferentes usando Winsock que podem ser usadas para ouvir várias conexões de cliente. Uma técnica de programação é criar um loop contínuo que verifica se há solicitações de conexão usando a função listen (consulte Listening on a Socket). Se ocorrer uma solicitação de conexão, o aplicativo chamará o accept, AcceptExou a função WSAAccept e passará o trabalho para outro thread para gerir 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; }
Quando a conexão do cliente tiver sido aceita, um aplicativo de servidor normalmente passará o soquete de 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 continuará aceitando conexões adicionais. Neste exemplo básico, o servidor continua para a próxima etapa.
Há uma série de outras técnicas de programação que podem ser usadas para ouvir e aceitar várias conexões. Isso inclui usar as funções ou WSAPoll. Exemplos de algumas dessas várias técnicas de programação são ilustrados no Advanced Winsock Samples incluído no Microsoft Windows Software Development Kit (SDK).
Observação
Em sistemas Unix, uma técnica de programação comum para servidores era para um aplicativo ouvir conexões. Quando uma conexão era aceita, o processo pai chamava a função de de bifurcação
para criar um novo processo filho para lidar com a conexão do cliente, herdando o soquete do pai. Esta técnica de programação não é suportada no Windows, uma vez que a função forknão é suportada. Essa técnica também geralmente não é adequada para servidores de alto desempenho, uma vez que os recursos necessários para criar um novo processo são muito maiores do que os necessários para um thread.
Uma vez que o aceitar função é chamado, o ListenSocket
não é mais necessário para este exemplo. A função closesocket é chamada para fechar o soquete.
// No longer need server socket
closesocket(ListenSocket);
Próxima etapa: receber e enviar dados no servidor