Windows Sockets: Verwenden von Sockets mit Archiven

In diesem Artikel wird das CSocket-Programmiermodell beschrieben. Klassen-CSocket liefert Socketunterstützung auf einer höheren Abstraktionsebene als die Klasse CAsyncSocket. CSocketverwendet 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 verwenden CAsyncSocket, aber das einfachste Programmiermodell ist die Verwendung 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: Sequence of Operations and Windows Sockets: Example of Sockets Using Archives. 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 mit Datagrammsockets. Wenn Sie für einen Datagrammsocket verwenden CSocket möchten, müssen Sie die Klasse wie sie verwenden CAsyncSocketwürden , d. h. ohne Archiv. Da Datagramme unzuverlässig sind (nicht garantiert eintreffen und möglicherweise nicht sequenziert werden), 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, ein Objekt für ein CArchive Datagramm zu verwendenCSocket, schlägt eine MFC-Assertion fehl.

  3. Wenn der Socket ein Client ist, rufen Sie CAsyncSocket::Verbinden 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 dieses neue Socketobjekt nicht auf Create .

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

  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 es nicht mit Datagrammsockets 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. Wird verwendet 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