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. 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 CAsyncSocket
selbst 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
Erstellen Sie ein CSocket-Objekt .
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 einCSocket
Serverobjekt müssen Sie einen Port imCreate
Aufruf angeben.Hinweis
CArchive
funktioniert nicht mit Datagrammsockets. Wenn Sie für einen Datagrammsocket verwendenCSocket
möchten, müssen Sie die Klasse wie sie verwendenCAsyncSocket
wü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 einCArchive
Datagramm zu verwendenCSocket
, schlägt eine MFC-Assertion fehl.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, leeresCSocket
Objekt als Parameter. Sie müssen dieses Objekt erstellen, bevor Sie aufrufenAccept
. Wenn dieses Socketobjekt außerhalb des Gültigkeitsbereichs liegt, wird die Verbindung geschlossen. Rufen Sie dieses neue Socketobjekt nicht aufCreate
.Erstellen Sie ein CSocketFile-Objekt , das das
CSocket
Objekt zugeordnet.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.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 zweiCArchive
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.
Zerstören Sie das Archiv, die Socketdatei und socketobjekte.
Hinweis
Klasse
CArchive
stellt dieIsBufferEmpty
Memberfunktion speziell für die Verwendung mit KlasseCSocket
zur 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 verwendetIsBufferEmpty
, 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: