Akzeptieren einer Verbindung (Windows Sockets 2)

Sobald der Socket auf eine Verbindung lauscht, muss das Programm Verbindungsanforderungen für diesen Socket verarbeiten.

So akzeptieren Sie eine Verbindung mit einem Socket

  1. Erstellen Sie ein temporäres SOCKET-Objekt namens ClientSocket, um Verbindungen von Clients zu akzeptieren.

    
    SOCKET ClientSocket;
    
    
    
  2. Normalerweise ist eine Serveranwendung so konzipiert, dass sie auf Verbindungen von mehreren Clients lauscht. Bei Hochleistungsservern werden häufig mehrere Threads verwendet, um mehrere Clientverbindungen zu verarbeiten.

    Es gibt verschiedene Programmiertechniken mit Winsock, die verwendet werden können, um auf mehrere Clientverbindungen zu lauschen. Eine Programmiertechnik besteht darin, eine fortlaufende Schleife zu erstellen, die mithilfe der Listenfunktion auf Verbindungsanforderungen überprüft (siehe Lauschen auf einem Socket). Wenn eine Verbindungsanforderung auftritt, ruft die Anwendung die Accept-, AcceptEx- oder WSAAccept-Funktion auf und übergibt die Arbeit an einen anderen Thread, um die Anforderung zu verarbeiten. Mehrere andere Programmiertechniken sind möglich.

    Beachten Sie, dass dieses einfache Beispiel sehr einfach ist und nicht mehrere Threads verwendet. Das Beispiel lauscht auch nur auf und akzeptiert nur eine einzelne Verbindung.

    
    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. Wenn die Clientverbindung akzeptiert wurde, übergibt eine Serveranwendung normalerweise den akzeptierten Clientsocket (die ClientSocket-Variable im obigen Beispielcode) an einen Workerthread oder einen E/A-Vervollständigungsport und akzeptiert weiterhin zusätzliche Verbindungen. In diesem einfachen Beispiel fährt der Server mit dem nächsten Schritt fort.

    Es gibt eine Reihe anderer Programmiertechniken, die verwendet werden können, um mehrere Verbindungen zu überwachen und zu akzeptieren. Dazu gehört die Verwendung der Select - oder WSAPoll-Funktionen . Beispiele für einige dieser verschiedenen Programmiertechniken werden in den erweiterten Winsock-Beispielen veranschaulicht, die im Microsoft Windows Software Development Kit (SDK) enthalten sind.

    Hinweis

    Auf Unix-Systemen war eine gängige Programmiertechnik für Server, dass eine Anwendung auf Verbindungen lauscht. Wenn eine Verbindung akzeptiert wurde, ruft der übergeordnete Prozess die Fork-Funktion auf, um einen neuen untergeordneten Prozess zur Verarbeitung der Clientverbindung zu erstellen, wobei der Socket vom übergeordneten Element geerbt wird. Diese Programmiertechnik wird unter Windows nicht unterstützt, da die Fork-Funktion nicht unterstützt wird. Diese Technik eignet sich in der Regel auch nicht für Hochleistungsserver, da die zum Erstellen eines neuen Prozesses benötigten Ressourcen viel größer sind als die für einen Thread benötigten.

     

Nächster Schritt: Empfangen und Senden von Daten auf dem Server

Erste Schritte mit Winsock

Winsock Server-Anwendung

Lauschen auf einem Socket