Windows Sockets: Verwenden der Klasse CAsyncSocket

In diesem Artikel wird die Verwendung der Klasse CAsyncSocketerläutert. Diese Klasse kapselt die Windows Sockets-API auf sehr niedriger Ebene. CAsyncSocket ist für Programmierer vorgesehen, die die Netzwerkkommunikation im Detail kennen, aber die Benutzerfreundlichkeit von Rückrufen für die Benachrichtigung über Netzwerkereignisse wünschen. Basierend auf dieser Annahme enthält dieser Artikel nur grundlegende Anweisungen. Sie sollten wahrscheinlich die Verwendung CAsyncSocket in Betracht ziehen, wenn Sie die Benutzerfreundlichkeit von Windows Sockets mit mehreren Netzwerkprotokollen in einer MFC-Anwendung verwenden möchten, aber keine Flexibilität opfern möchten. Sie können auch das Gefühl haben, dass Sie eine bessere Effizienz erzielen können, indem Sie die Kommunikation direkt programmieren, als sie das allgemeinere alternative Modell der Klasse CSocketverwenden könnten.

CAsyncSocket ist in der MFC-Referenz dokumentiert. Visual C++ stellt außerdem die Windows Sockets-Spezifikation bereit, die sich im Windows SDK befindet. Die Details bleiben Ihnen überlassen. Visual C++ stellt keine Beispielanwendung für CAsyncSocket.

Wenn Sie über die Netzwerkkommunikation nicht sehr vertraut sind und eine einfache Lösung benötigen, verwenden Sie eine Klasse CSocket mit einem CArchive Objekt. Weitere Informationen finden Sie unter Windows Sockets: Verwenden von Sockets mit Archiven .

In diesem Artikel wird Folgendes behandelt:

Erstellen und Verwenden einer CAsyncSocket

So verwenden Sie CAsyncSocket

  1. Erstellen Sie ein CAsyncSocket Objekt, und verwenden Sie das Objekt, um das zugrunde liegende SOCKET Handle zu erstellen.

    Die Erstellung eines Sockets folgt dem MFC-Muster der zweistufigen Konstruktion.

    Beispiel:

    CAsyncSocket sock;
    sock.Create(); // Use the default parameters
    

    Oder

    CAsyncSocket *pSocket = new CAsyncSocket;
    int nPort = 27;
    pSocket->Create(nPort, SOCK_DGRAM);
    

    Der erste Konstruktor oben erstellt ein CAsyncSocket Objekt im Stapel. Der zweite Konstruktor erstellt einen CAsyncSocket für den Heap. Der erste aufruf Create oben verwendet die Standardparameter zum Erstellen eines Datenstromsockets. Der zweite Create Aufruf erstellt einen Datagrammsocket mit einem angegebenen Port und einer angegebenen Adresse. (Sie können beide Versionen mit beiden Create Konstruktionsmethoden verwenden.)

    Die folgenden Parameter sind:Create

    • Ein "Port": eine kurze ganze Zahl.

      Für einen Serversocket müssen Sie einen Port angeben. Für einen Clientsocket akzeptieren Sie in der Regel den Standardwert für diesen Parameter, mit dem Windows Sockets einen Port auswählen können.

    • Ein Sockettyp: SOCK_STREAM (Standard) oder SOCK_DGRAM.

    • Eine Socketadresse, z "ftp.microsoft.com" . B. oder "128.56.22.8".

      Dies ist Ihre IP-Adresse (Internet Protocol) im Netzwerk. Sie sind wahrscheinlich immer auf den Standardwert für diesen Parameter angewiesen.

    Die Begriffe "Port" und "Socketadresse" werden in Windows Sockets erläutert: Ports und Socketadressen.

  2. Wenn es sich bei dem Socket um einen Client handelt, verbinden Sie das Socketobjekt mithilfe von CAsyncSocket::Connect.

    Oder

    Wenn es sich bei dem Socket um einen Server handelt, legen Sie den Socket so fest, dass er mit dem Überwachen (mit CAsyncSocket::Listen) für Verbindungsversuche von einem Client beginnt. Wenn Sie eine Verbindungsanfrage erhalten haben, akzeptieren Sie sie mit CAsyncSocket::Accept.

    Nachdem Sie eine Verbindung akzeptiert haben, können Sie Aufgaben wie das Überprüfen von Kennwörtern ausführen.

    Hinweis

    Die Accept Memberfunktion verwendet einen Verweis auf ein neues, leeres CSocket Objekt als Parameter. Sie müssen dieses Objekt erstellen, bevor Sie aufrufen Accept. Wenn dieses Socketobjekt außerhalb des Gültigkeitsbereichs liegt, wird die Verbindung geschlossen. Rufen Sie dieses neue Socketobjekt nicht auf Create . Ein Beispiel finden Sie im Artikel "Windows Sockets: Sequence of Operations".

  3. Führen Sie die Kommunikation mit anderen Sockets aus, indem Sie die Memberfunktionen des CAsyncSocket Objekts aufrufen, die die Windows Sockets-API-Funktionen kapseln.

    Weitere Informationen finden Sie in der Windows Sockets-Spezifikation und -Klasse CAsyncSocket in der MFC-Referenz.

  4. Zerstören Sie das CAsyncSocket Objekt.

    Wenn Sie das Socketobjekt auf dem Stapel erstellt haben, wird dessen Destruktor aufgerufen, wenn die enthaltende Funktion außerhalb des Gültigkeitsbereichs liegt. Wenn Sie das Socketobjekt auf dem Heap erstellt haben, verwenden Sie den new Operator, um delete das Objekt zu zerstören.

    Der Destruktor ruft die Memberfunktion des Close Objekts auf, bevor das Objekt zerstört wird.

Ein Beispiel für diese Sequenz im Code (tatsächlich für ein CSocket Objekt) finden Sie unter Windows Sockets: Sequence of Operations.

Ihre Verantwortlichkeiten mit CAsyncSocket

Wenn Sie ein Objekt der Klasse CAsyncSocketerstellen, kapselt das Objekt ein Windows-Handle SOCKET und liefert Vorgänge auf diesem Handle. Wenn Sie diese Verwenden verwenden CAsyncSocket, müssen Sie alle Probleme behandeln, die bei der direkten Verwendung der API auftreten können. Beispiel:

  • "Blockierungsszenarien".

  • Bytereihenfolgeunterschiede zwischen den Sende- und Empfangscomputern.

  • Konvertieren zwischen Unicode- und Multibyte-Zeichensatzzeichenfolgen (MBCS).

Definitionen dieser Begriffe und zusätzliche Informationen finden Sie unter Windows Sockets: Blocking, Windows Sockets: Byte-Sortierung, Windows Sockets: Konvertieren von Zeichenfolgen.

Trotz dieser Probleme ist die Klasse CAsyncSocket möglicherweise die richtige Wahl für Sie, wenn Ihre Anwendung alle Flexibilität und Kontrolle erfordert, die Sie erhalten können. Falls nicht, sollten Sie stattdessen die Verwendung der Klasse CSocket in Betracht ziehen. CSocket blendet viele Details von Ihnen aus: Windows-Nachrichten werden während des Blockierens von Anrufen gepumpt und erhalten Zugriff, CArchiveder Die Bytereihenfolgenunterschiede und die Zeichenfolgenkonvertierung für Sie verwaltet.

Weitere Informationen finden Sie unter:

Siehe auch

Windows-Sockets in MFC