Condividi tramite


Accettazione di una connessione (Windows Sockets 2)

Quando il socket è in ascolto di una connessione, il programma deve gestire le richieste di connessione su tale socket.

Per accettare una connessione su un socket

  1. Creare un oggetto temporaneo SOCKET denominato ClientSocket per accettare connessioni dai client.

    
    SOCKET ClientSocket;
    
    
    
  2. In genere, un'applicazione server è progettata per l'ascolto delle connessioni da più client. Per i server ad alte prestazioni, più thread vengono comunemente usati per gestire più connessioni client.

    Esistono diverse tecniche di programmazione che utilizzano Winsock e possono essere impiegate per gestire più connessioni client. Una tecnica di programmazione consiste nel creare un ciclo continuo che verifica la presenza di richieste di connessione usando la funzione di ascolto (vedere Ascolto su un Socket). Se si verifica una richiesta di connessione, l'applicazione chiama la funzione accept, la funzione AcceptEx, oppure la funzione WSAAccept e passa il lavoro a un altro thread per gestire la richiesta. Sono possibili diverse altre tecniche di programmazione.

    Si noti bene che questo esempio di base è molto semplice e non utilizza thread multipli. L'esempio si limita ad ascoltare e accetta solo una singola connessione.

    
    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 la connessione client è stata accettata, un'applicazione server passa normalmente il socket client accettato (la variabile ClientSocket nel codice di esempio precedente) a un thread di lavoro o a una porta di completamento I/O e continua ad accettare connessioni aggiuntive. In questo esempio di base il server continua con il passaggio successivo.

    Esistono diverse altre tecniche di programmazione che possono essere usate per ascoltare e accettare più connessioni. Questi includono l'uso delle funzioni selezione o WSAPoll. Alcuni esempi di queste varie tecniche di programmazione sono illustrati nei Advanced Winsock Samples inclusi nel Microsoft Windows Software Development Kit (SDK).

    Nota

    Nei sistemi Unix, una tecnica di programmazione comune per i server era che un'applicazione ascoltasse le connessioni. Quando veniva accettata una connessione, il processo padre chiamava la funzione fork per creare un nuovo processo figlio per gestire la connessione client, ereditando il socket dal processo padre. Questa tecnica di programmazione non è supportata in Windows, perché la funzione fork non è supportata. Questa tecnica non è in genere adatta ai server ad alte prestazioni, poiché le risorse necessarie per creare un nuovo processo sono molto maggiori di quelle necessarie per un thread.

Dopo aver chiamato la funzione accettare , il ListenSocket non è più necessario per questo esempio. La funzione closesocket viene chiamata per chiudere il socket.

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

Passaggio successivo: ricezione e invio di dati nel server

Introduzione a Winsock

Applicazione server Winsock

In ascolto su un Socket