Delen via


Een verbinding accepteren (Windows Sockets 2)

Zodra de socket naar een verbinding luistert, moet het programma verbindingsaanvragen op die socket afhandelen.

Een verbinding accepteren op een socket

  1. Maak een tijdelijk SOCKET--object met de naam ClientSocket voor het accepteren van verbindingen van clients.

    
    SOCKET ClientSocket;
    
    
    
  2. Normaal gesproken zou een servertoepassing zijn ontworpen om te luisteren naar verbindingen van meerdere clients. Voor servers met hoge prestaties worden meerdere threads vaak gebruikt voor het afhandelen van de meerdere clientverbindingen.

    Er zijn verschillende programmeertechnieken die winsock gebruiken om te luisteren naar meerdere clientverbindingen. Een programmeertechniek is het maken van een continue lus die controleert op verbindingsaanvragen met behulp van de functie luisteren (zie Luisteren op een Socket-). Als er een verbindingsaanvraag optreedt, roept de toepassing de accepteren, AcceptEx-of WSAAccept- functie aan en geeft het werk door aan een andere thread om de aanvraag te verwerken. Er zijn verschillende andere programmeertechnieken mogelijk.

    Houd er rekening mee dat dit eenvoudige voorbeeld heel eenvoudig is en geen gebruik maakt van meerdere threads. In het voorbeeld wordt ook alleen naar één verbinding geluisterd en geaccepteerd.

    
    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. Wanneer de clientverbinding is geaccepteerd, zou een servertoepassing normaal gesproken de geaccepteerde clientsocket (de ClientSocket-variabele in de bovenstaande voorbeeldcode) doorgeven aan een werkrolthread of een I/O-voltooiingspoort en doorgaan met het accepteren van extra verbindingen. In dit basisvoorbeeld gaat de server verder met de volgende stap.

    Er zijn een aantal andere programmeertechnieken die kunnen worden gebruikt om naar meerdere verbindingen te luisteren en te accepteren. Deze omvatten het gebruik van de functies select of WSAPoll. Voorbeelden van enkele van deze verschillende programmeertechnieken worden geïllustreerd in de Advanced Winsock Samples opgenomen in de Microsoft Windows Software Development Kit (SDK).

    Notitie

    Op Unix-systemen was een veelgebruikte programmeertechniek voor servers dat een toepassing naar verbindingen moest luisteren. Wanneer een verbinding is geaccepteerd, roept het ouderproces de fork-functie aan om een nieuw kindproces te maken voor het afhandelen van de clientverbinding, waarbij de socket van het ouderproces wordt geërfd. Deze programmeertechniek wordt niet ondersteund in Windows, omdat de fork- functie niet wordt ondersteund. Deze techniek is meestal niet geschikt voor servers met hoge prestaties, omdat de resources die nodig zijn om een nieuw proces te maken veel groter zijn dan de resources die nodig zijn voor een thread.

Zodra de accept-functie wordt aangeroepen, is de ListenSocket voor dit voorbeeld niet meer nodig. De closesocket functie wordt aangeroepen om de socket te sluiten.

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

Volgende stap: gegevens ontvangen en verzenden op de server

Aan de slag met Winsock

Winsock Server-toepassing

Luisteren op een socket