Windows Sockets: Wie Sockets mit Archiven arbeiten

In diesem Artikel wird beschrieben, wie ein CSocket-Objekt, ein CSocketFile-Objekt und ein CArchive-Objekt kombiniert werden, um das Senden und Empfangen von Daten von einem Windows Socket zu vereinfachen.

Der Artikel Windows-Sockets: Beispiel für Sockets mit der Archive stellt die PacketSerialize-Funktion dar.Das Objekt im Archiv PacketSerialize Beispiel funktioniert ähnlich wie ein Archiv Objekt, das an eine Funktion übergeben wird. Serialize MFCDer Hauptunterschied besteht der für Sockets, das Archiv angefügt ist nicht auf einen Standard- C-Datei-Objekt zugeordnet ist (meist jedoch einer Datenträgerdatei) zu einem CSocketFile-Objekt.Statt Herstellen einer Verbindung mit einer Datenträgerdatei, schließt das CSocketFile-Objekt an CSocket ein Objekt an.

Ein CArchive-Objekt verwaltet einen Puffer.Wenn der Puffer eines Archivs) sendenden (speichernden voll ist, schreibt ein zugeordnetes CFile-Objekt den Inhalt des Puffers aus.Der Puffer eines Archivs zu leeren, das einem Socket angefügt wird, ist zum Senden einer Nachricht.Wenn der Puffer eines Archivs des Ladevorgangs (empfangen) voll ist, wird das CFile-Objekt zu lesen, bis der Puffer wieder verfügbar ist.

CSocketFile-Klasse leitet sich von CFile, aber es unterstützt keine C-Datei wie die Memberfunktionen die Positionierung dargestellt, GetLength,Seek-Funktionen ( SetLength usw.), die Sperre funktioniert (LockRange, UnlockRange) oder die GetPosition-Funktion.Das Objekt muss CSocketFile alle darin, Bytesequenzen in den oder aus dem zugeordneten CSocket-Objekt zu lesen oder zu schreiben.Da eine Datei nicht beteiligt ist, sind Vorgänge wie Seek und GetPosition nicht sinnvoll.CSocketFile ist von CFile abgeleitet. Daher ist es normalerweise alle dieser Memberfunktionen erben.Um dies zu verhindern, werden nicht unterstützt CFile-Memberfunktionen in CSocketFile überschrieben um CNotSupportedException auszulösen.

Das CSocketFile-Objekt ruft CSocket-Memberfunktionen des Objekts auf, um Daten zu senden oder zu empfangen.

Die folgende Abbildung zeigt die Beziehungen zwischen diesen Objekten auf beiden Seiten von der Kommunikation an.

CArchive, CSocketFile und CSocket

CArchive CSocketFile CSocket

Der Zweck dieser offensichtlichen Komplexität ist mit dem Schild Sie von der Notwendigkeit für die Verwaltung der Details des Sockets.Sie stellen den Socket, die Datei und das Archiv und starten dann das Senden oder Empfangen von Daten, indem Sie es zum Archiv einfügen oder sie aus dem Archiv extrahieren.CArchive, CSocketFile und Verwalten CSocket die Details im Hintergrund.

Ein CSocket-Objekt handelt es sich eigentlich um zwei ein Objekt: manchmal (asynchron) und manchmal der übliche Bedingung synchron.In dem asynchronen Zustand kann ein Socket asynchronen Empfang von Benachrichtigungen vom Framework.Während eines Vorgangs für das Empfangen und Senden von Daten wird der Socket synchron.Dies bedeutet, dass der Socket keine weitere asynchrone Benachrichtigungen empfängt, bis der Gleichlaufbetrieb abgeschlossen wurde.Da es Modi wechseln, können Sie z. B. in etwa Folgendes tun:

void CMySocket::OnReceive(int nErrorCode)
{
   if (0 == nErrorCode)
   {
      CSocketFile file(this);
      CArchive ar(&file, CArchive::load);
      CString str;

      ar >> str;
   }
}

Wenn CSocket nicht als zwei Objekt implementiert wurden, könnte es möglich, zusätzliche Benachrichtigungen für die gleiche Art des Ereignisses zu empfangen, während Sie eine vorherige Benachrichtigung verarbeiteten.Zum Beispiel könnten Sie eine OnReceive Benachrichtigung beim Verarbeiten von OnReceive ab.Im obigen Codefragment wird, führt das Extrahieren von str aus dem Archiv zu Rekursion.Durch die Verwendung von Zuständen wechselt, verhindert CSocket, indem Sie zusätzliche Benachrichtigungen Rekursion verhindert.Die allgemeine Regel ist keine Benachrichtigungen innerhalb der Benachrichtigungen.

HinweisHinweis

CSocketFile kann auf eine eingeschränkte (A) - Datei ohne ein CArchive-Objekt ebenfalls verwendet werden.Standardmäßig ist der CSocketFilebArchiveCompatible-Parameter des Konstruktors TRUE.Dies gibt an, dass das Dateiobjekt für die Verwendung mit einem Archiv ist.Um das Dateiobjekt verwenden, ohne ein Archiv FALSE im bArchiveCompatible-Parameter übergeben.

In einem kompatiblen" Modus "des Archivs stellt ein CSocketFile-Objekt eine bessere Leistung und reduziert die Gefahr eines Deadlocks "." Ein Deadlock tritt auf, wenn die sendenden und empfangenden Sockets auf aufeinander warten, auf oder eine allgemeine Ressource gewartet.Diese Situation kann eintreten, wenn das CArchive-Objekt mit CSocketFile die Methode funktioniert, die mit einem CFile-Objekt.Mit CFile kann das Archiv davon ausgehen, dass, wenn weniger Bytes als empfängt, das angefordert hat, es ist Dateiende erreicht.Mit CSocketFile die Daten jedoch auf der Meldung. Der Puffer kann mehrere Nachrichten, sodass das Empfangen weniger enthalten, als die Anzahl der angeforderten Bytes nicht Dateiende impliziert.Die Anwendung wird in diesem Fall nicht, wie sie mit CFile konnte, Meldungen aus dem Puffer gelesen und fortfahren kann, bis der Puffer leer ist.Die IsBufferEmpty-Funktion in CArchive ist für den Zustand des Puffers des Archivs in einem solchen Fall Überwachen nützlich.

Weitere Informationen finden Sie unter Windows-Sockets: Verwenden von Sockets mit Archiven

Siehe auch

Referenz

CObject::Serialize

Konzepte

Windows Sockets in MFC