Freigeben über


Windows Sockets: Verwenden von Sockets mit Archiven

Hinweis

Die Microsoft Foundation Classes (MFC)-Bibliothek wird weiterhin unterstützt. Wir fügen jedoch keine Features mehr hinzu oder aktualisieren die Dokumentation.

In diesem Artikel wird das CSocket-Programmiermodell beschrieben. Klassen-CSocket liefert Socketunterstützung auf einer höheren Abstraktionsebene als die Klasse CAsyncSocket. CSocket verwendet eine Version des MFC-Serialisierungsprotokolls, um Daten über ein MFC-CArchive-Objekt an und von einem Socketobjekt zu übergeben. CSocket bietet Blockierung (während der Verwaltung der Hintergrundverarbeitung von Windows-Nachrichten) und bietet Zugriff auf CArchive, wodurch viele Aspekte der Kommunikation verwaltet werden, die Sie entweder mit der rohen API oder Klasse CAsyncSocketselbst erledigen müssen.

Tipp

Sie können die Klasse CSocket selbst, als komfortablere Version von CAsyncSocket, verwenden, aber das einfachste Programmiermodell ist die Nutzung von CSocket mit einem CArchive Objekt.

Weitere Informationen dazu, wie die Implementierung von Sockets mit Archiven funktioniert, finden Sie unter Windows Sockets: How Sockets with Archives Work. Beispielcode finden Sie unter Windows-Sockets: Abfolge von Operationen und Windows-Sockets: Beispiel für die Verwendung von Sockets mit Archiven. Informationen zu einigen der Funktionen, die Sie erzielen können, indem Sie Ihre eigenen Klassen aus den Sockets-Klassen ableiten, finden Sie unter Windows Sockets: Ableiten von Socketklassen.

Hinweis

Wenn Sie ein MFC-Clientprogramm für die Kommunikation mit etablierten (nicht MFC)-Servern schreiben, senden Sie keine C++-Objekte über das Archiv. Es sei denn, der Server ist eine MFC-Anwendung, die die Art der zu sendenden Objekte versteht, kann sie Ihre Objekte nicht empfangen und deserialisieren. Verwandtes Material zum Thema Kommunikation mit Nicht-MFC-Anwendungen finden Sie auch im Artikel Windows Sockets: Byte-Sortierung.

Das CSocket-Programmiermodell

Die Verwendung eines CSocket Objekts umfasst das Erstellen und Zuordnen mehrerer MFC-Klassenobjekte. Im folgenden allgemeinen Verfahren wird jeder Schritt sowohl vom Serversocket als auch vom Clientsocket ausgeführt, mit Ausnahme von Schritt 3, in dem jeder Sockettyp eine andere Aktion erfordert.

Tipp

Zur Laufzeit beginnt die Serveranwendung in der Regel zuerst, um bereit zu sein und "zuzuhören", wenn die Clientanwendung eine Verbindung sucht. Wenn der Server nicht bereit ist, wenn der Client versucht, eine Verbindung herzustellen, müssen Sie die Benutzeranwendung in der Regel später erneut versuchen, eine Verbindung herzustellen.

So richten Sie die Kommunikation zwischen einem Serversocket und einem Clientsocket ein

  1. Erstellen Sie ein CSocket-Objekt .

  2. Verwenden Sie das Objekt, um das zugrunde liegende SOCKET-Handle zu erstellen.

    Für ein CSocket Clientobjekt sollten Sie normalerweise die Standardparameter zum Erstellen verwenden, es sei denn, Sie benötigen einen Datagrammsocket. Für ein CSocket Serverobjekt müssen Sie einen Port im Create Aufruf angeben.

    Hinweis

    CArchive funktioniert nicht für Datagramm-Sockets. Wenn Sie CSocket für einen Datagrammsocket verwenden möchten, müssen Sie die Klasse wie CAsyncSocket verwenden, das heißt, ohne Archiv. Da Datagramme unzuverlässig sind (keine Garantie besteht, dass sie eintreffen, möglicherweise wiederholt werden oder in falscher Reihenfolge ankommen), sind sie nicht mit der Serialisierung über ein Archiv kompatibel. Sie erwarten, dass ein Serialisierungsvorgang zuverlässig und in Sequenz abgeschlossen wird. Wenn Sie versuchen, CSocket mit einem CArchive-Objekt für ein Datagramm zu verwenden, schlägt eine MFC-Assertion fehl.

  3. Wenn es sich bei dem Socket um einen Client handelt, rufen Sie CAsyncSocket::Connect auf, um das Socketobjekt mit einem Serversocket zu verbinden.

    -oder-

    Wenn der Socket ein Server ist, rufen Sie CAsyncSocket::Listen auf, um mit der Überwachung von Verbindungsversuchen von einem Client zu beginnen. Wenn Sie eine Verbindungsanforderung empfangen haben, akzeptieren Sie sie durch Aufrufen von CAsyncSocket::Accept.

    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 nicht Create für dieses neue Socketobjekt auf.

  4. Erstellen Sie ein CSocketFile-Objekt, das dem CSocket Objekt zugeordnet ist.

  5. Erstellen Sie ein CArchive-Objekt zum Laden (Empfangen) oder Speichern (Senden) von Daten. Das Archiv ist dem CSocketFile Objekt zugeordnet.

    Denken Sie daran, dass CArchive nicht mit Datagramm-Sockets funktioniert.

  6. Verwenden Sie das CArchive Objekt, um Daten zwischen Client- und Serversockets zu übergeben.

    Denken Sie daran, dass ein bestimmtes CArchive Objekt Daten nur in eine Richtung verschiebt: entweder zum Laden (Empfangen) oder Speichern (Senden). In einigen Fällen verwenden Sie zwei CArchive Objekte: eine zum Senden von Daten, die andere zum Empfangen von Bestätigungen.

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

  7. Zerstören Sie das Archiv, die Socketdatei und Socketobjekte.

    Hinweis

    Klasse CArchive stellt die IsBufferEmpty Memberfunktion speziell für die Verwendung mit Klasse CSocketzur Verfügung. Wenn der Puffer z. B. mehrere Datenmeldungen enthält, müssen Sie eine Schleife ausführen, bis alle gelesen werden und der Puffer gelöscht wird. Andernfalls kann Ihre nächste Benachrichtigung, dass Daten empfangen werden, unbegrenzt verzögert werden. Verwenden Sie IsBufferEmpty, um sicherzustellen, dass Sie alle Daten abrufen.

Der Artikel Windows Sockets: Sequence of Operations veranschaulicht beide Seiten dieses Prozesses mit Beispielcode.

Weitere Informationen finden Sie unter:

Siehe auch

Windows Sockets in MFC
CSocket::Create