Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
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 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
CSocketClientobjekt sollten Sie normalerweise die Standardparameter zum Erstellen verwenden, es sei denn, Sie benötigen einen Datagrammsocket. Für einCSocketServerobjekt müssen Sie einen Port imCreateAufruf angeben.Hinweis
CArchivefunktioniert nicht mit Datagrammsockets. Wenn Sie für einen Datagrammsocket verwendenCSocketmöchten, müssen Sie die Klasse wie sie verwendenCAsyncSocketwü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 einCArchiveDatagramm zu verwendenCSocket, schlägt eine MFC-Assertion fehl.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
AcceptMemberfunktion verwendet einen Verweis auf ein neues, leeresCSocketObjekt 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
CSocketObjekt zugeordnet.Erstellen Sie ein CArchive-Objekt zum Laden (Empfangen) oder Speichern (Senden) von Daten. Das Archiv ist dem
CSocketFileObjekt zugeordnet.Denken Sie daran, dass
CArchivees nicht mit Datagrammsockets funktioniert.Verwenden Sie das
CArchiveObjekt, um Daten zwischen Client- und Serversockets zu übergeben.Denken Sie daran, dass ein bestimmtes
CArchiveObjekt Daten nur in eine Richtung verschiebt: entweder zum Laden (Empfangen) oder Speichern (Senden). In einigen Fällen verwenden Sie zweiCArchiveObjekte: 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
CArchivestellt dieIsBufferEmptyMemberfunktion speziell für die Verwendung mit KlasseCSocketzur 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: