CSocketFile-Klasse

Ein CFile -Objekt zum Senden und Empfangen von Daten in einem Netzwerk über Windows Sockets.

Syntax

class CSocketFile : public CFile

Member

Öffentliche Konstruktoren

Name Beschreibung
CSocketFile::CSocketFile Erstellt ein CSocketFile-Objekt.

Hinweise

Sie können das CSocketFile Objekt zu diesem Zweck an ein CSocket Objekt anfügen. Sie können das Objekt auch an ein CArchive Objekt anfügen, um das CSocketFile Senden und Empfangen von Daten mithilfe der MFC-Serialisierung zu vereinfachen.

Zum Serialisieren (Senden) von Daten fügen Sie sie in das Archiv ein, das Memberfunktionen aufruft CSocketFile , um Daten in das CSocket Objekt zu schreiben. Zum Deserialisieren (Empfangen) von Daten extrahieren Sie aus dem Archiv. Dies bewirkt, dass das Archiv Memberfunktionen aufruft CSocketFile , um Daten aus dem CSocket Objekt zu lesen.

Tipp

Neben der hier beschriebenen Verwendung CSocketFile können Sie es als eigenständiges Dateiobjekt verwenden, genau wie bei CFileder Basisklasse. Sie können auch mit allen archivbasierten MFC-Serialisierungsfunktionen verwenden CSocketFile . Da CSocketFile nicht alle Funktionen unterstützt CFilewerden, sind einige standardmäßige MFC-Serialisierungsfunktionen nicht kompatibel mit CSocketFile. Dies gilt besonders für die CEditView Klasse. Sie sollten nicht versuchen, Daten über ein Objekt zu serialisieren CEditView , das mit einem CArchiveCSocketFile Objekt CEditView::SerializeRawverbunden ist; verwenden Sie CEditView::Serialize stattdessen. Die SerializeRaw Funktion erwartet, dass das Dateiobjekt Funktionen Seekwie z CSocketFile . B. nicht hat.

Bei Verwendung CArchive mit CSocketFile und CSocketkönnen Sie auf eine Situation stoßen, in der CSocket::Receive eine Schleife (nach PumpMessages(FD_READ)) auf die angeforderte Bytemenge wartet. Dies liegt daran, dass Windows-Sockets nur einen Recv-Anruf pro FD_READ Benachrichtigung zulassen, aber CSocketFileCSocket mehrere Recv-Anrufe pro FD_READ zulassen. Wenn Sie eine FD_READ erhalten, wenn keine Zu lesenden Daten vorhanden sind, hängt die Anwendung. Wenn Sie nie eine andere FD_READ erhalten, kommuniziert die Anwendung nicht mehr über den Socket.

Sie können dieses Problem wie folgt beheben. Rufen Sie in der OnReceive Methode Der Socketklasse auf CAsyncSocket::IOCtl(FIONREAD, ...) , bevor Sie die Serialize Methode der Nachrichtenklasse aufrufen, wenn die erwarteten Daten aus dem Socket gelesen werden, die Größe eines TCP-Pakets überschreitet (maximale Übertragungseinheit des Netzwerkmediums, in der Regel mindestens 1096 Byte). Wenn die Größe der verfügbaren Daten kleiner als erforderlich ist, warten Sie, bis alle Daten empfangen werden, und starten Sie dann den Lesevorgang.

Im folgenden Beispiel ist die ungefähre Anzahl von Bytes angegeben, m_dwExpected die der Benutzer empfängt. Es wird davon ausgegangen, dass Sie sie an anderer Stelle im Code deklarieren.

void CChatSocket::OnReceive(int nErrorCode)
{
   CSocket::OnReceive(nErrorCode);

   DWORD dwReceived;

   if (IOCtl(FIONREAD, &dwReceived))
   {
      if (dwReceived >= m_dwExpected) // Process only if you have enough data
         m_pDoc->ProcessPendingRead();
   }
   else
   {
      // Error handling here
   }
}

Weitere Informationen finden Sie unter Windows Sockets in MFC, Windows Sockets: Verwenden von Sockets mit Archiven sowie windows Sockets 2-API.

Vererbungshierarchie

CObject

Cfile

CSocketFile

Anforderungen

Kopfzeile: afxsock.h

CSocketFile::CSocketFile

Erstellt ein CSocketFile-Objekt.

explicit CSocketFile(
    CSocket* pSocket,
    BOOL bArchiveCompatible = TRUE);

Parameter

pSocket
Der Socket, der an das CSocketFile Objekt angefügt werden soll.

bArchiveCompatible
Gibt an, ob das Dateiobjekt für ein CArchive Objekt verwendet werden soll. Übergeben Sie FALSE nur, wenn Sie das CSocketFile Objekt auf eigenständige Weise wie ein eigenständiges CFile Objekt mit bestimmten Einschränkungen verwenden möchten. Dieses Kennzeichen ändert, wie das CArchive objekt angefügte CSocketFile Objekt den Puffer zum Lesen verwaltet.

Hinweise

Der Destruktor des Objekts hebt sich vom Socketobjekt ab, wenn das Objekt außerhalb des Gültigkeitsbereichs liegt oder gelöscht wird.

Hinweis

A CSocketFile kann auch als (eingeschränkte) Datei ohne Objekt CArchive verwendet werden. Standardmäßig ist der bArchiveCompatible-Parameter des CSocketFileKonstruktors TRUE. Dadurch wird angegeben, dass das Dateiobjekt für ein Archiv verwendet werden soll. Um das Dateiobjekt ohne Archiv zu verwenden, übergeben Sie FALSE im bArchiveCompatible-Parameter .

Im Modus "archivkompatibel" bietet ein CSocketFile Objekt eine bessere Leistung und reduziert die Gefahr eines "Deadlocks". Ein Deadlock tritt auf, wenn sowohl die sende- als auch die empfangenden Sockets aufeinander warten oder auf eine gemeinsame Ressource. Diese Situation kann auftreten, wenn das CArchive Objekt mit der CSocketFile Funktionsweise eines CFile Objekts gearbeitet hat. Mit CFiledem Archiv kann davon ausgegangen werden, dass das Ende der Datei erreicht wurde, wenn es weniger Bytes als angefordert empfängt.

Bei CSocketFileDaten handelt es sich jedoch um nachrichtenbasierte Daten. Der Puffer kann mehrere Nachrichten enthalten, sodass der Empfang weniger als die anzahl der angeforderten Bytes nicht das Ende der Datei bedeutet. Die Anwendung wird in diesem Fall nicht blockiert, wie dies möglich CFileist, und sie kann mit dem Lesen von Nachrichten aus dem Puffer fortfahren, bis der Puffer leer ist. Die Funktion "CArchive::IsBufferEmpty " ist nützlich, um den Zustand des Archivpuffers in einem solchen Fall zu überwachen.

Weitere Informationen zur Verwendung finden Sie in den Artikeln Windows Sockets: Verwenden von CSocketFileSockets mit Archiven und Windows Sockets: Beispiel für Sockets Using Archives.

Siehe auch

CFile-Klasse
Hierarchiediagramm
CAsyncSocket-Klasse
CSocket-Klasse