Freigeben über


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 in einem Socket-

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

    
    SOCKET ClientSocket;
    
    
    
  2. Normalerweise wäre eine Serveranwendung so konzipiert, dass verbindungen von mehreren Clients überwacht werden. Bei Hochleistungsservern werden häufig mehrere Threads verwendet, um die mehreren 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 endlose Schleife zu erstellen, die mithilfe der Lausch-Funktion auf Verbindungsanforderungen überprüft (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. Verschiedene 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 eine einzige Verbindung und akzeptiert diese.

    
    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 weiterhin zusätzliche 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 mehrere Verbindungen zu überwachen und zu akzeptieren. Dazu gehört die Verwendung der select oder WSAPoll--Funktionen. Beispiele für einige dieser verschiedenen Programmiertechniken sind in den Advanced Winsock Samples enthalten, die im Microsoft Windows Software Development Kit (SDK) enthalten sind.

    Anmerkung

    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 zum Behandeln der Clientverbindung zu erstellen, wobei der Socket vom übergeordneten Prozess übernommen 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.

Sobald die accept-Funktion aufgerufen wird, wird die ListenSocket für dieses Beispiel nicht mehr benötigt. Die Funktion closesocket wird aufgerufen, um den Socket zu schließen.

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

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

Erste Schritte mit Winsock

Winsock Server-Anwendung

Lauschen an einem Socket