Akzeptieren einer Verbindung (Windows Sockets 2)

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

So akzeptieren Sie eine Verbindung auf 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 lauss. Bei Hochleistungsservern werden häufig mehrere Threads verwendet, um mehrere Clientverbindungen zu verarbeiten.

    Es gibt mehrere verschiedene Programmiertechniken mit Winsock, die zum Lauschen auf mehrere Clientverbindungen verwendet werden können. Eine Programmiertechnik ist das Erstellen einer kontinuierlichen Schleife, die mithilfe der Lauschfunktion nach Verbindungsanforderungen sucht (siehe Lauschen an 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. Es sind mehrere andere Programmiertechniken möglich.

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

    
    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, würde eine Serveranwendung normalerweise den akzeptierten Clientsocket (die ClientSocket-Variable im obigen Beispielcode) an einen Arbeitsthread oder einen E/A-Abschlussport übergeben und weitere Verbindungen akzeptieren. 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 auf mehrere Verbindungen zu lauschen und diese zu akzeptieren. Dazu gehört die Verwendung der Select- oder WSAPoll-Funktionen. Beispiele für einige dieser verschiedenen Programmiertechniken sind in den advanced Winsock-Beispielen dargestellt, 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 lauss. Wenn eine Verbindung akzeptiert wurde, würde der übergeordnete Prozess die Fork-Funktion aufrufen, um einen neuen untergeordneten Prozess zur Verarbeitung der Clientverbindung zu erstellen, der den Socket vom übergeordneten Element erbt. Diese Programmiertechnik wird in der 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 Ressourcen, die zum Erstellen eines neuen Prozesses erforderlich sind, viel größer sind als die für einen Thread benötigten Ressourcen.

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

Erste Schritte mit Winsock

Winsock Server-Anwendung

Lauschen an einem Socket