Freigeben über


CSocketFile-Klasse

Ein Objekt CFile zum Senden und Empfangen von Daten über ein Netzwerk zu Windows Sockets.

class CSocketFile : public CFile

Mitglieder

1e4zc0sx.collapse_all(de-de,VS.110).gifÖffentliche Konstruktoren

Name

Description

CSocketFile::CSocketFile

Erstellt ein CSocketFile-Objekt.

Hinweise

Sie können das CSocketFile-Objekt zu einem CSocket-Objekt zu diesem Zweck anfügen.Sie können auch und führen normalerweise, das CSocketFile-Objekt zu einem CArchive-Objekt anzufügen, um das Senden und Empfangen von Daten mit MFC-Serialisierung zu vereinfachen.

Um (senden) Daten zu serialisieren, fügen Sie sie in das Archiv ein, das CSocketFile-Memberfunktionen aufruft der Daten auf dem CSocket-Objekt schreiben.Um (empfangen) Daten zu deserialisieren, extrahieren Sie im Archiv.Dadurch wird das Archivdatei, CSocketFile-Memberfunktionen aufrufen, um Daten vom CSocket-Objekt.

TippTipp

Neben der Verwendung von CSocketFile, wie hier beschrieben, können Sie es, wie ein eigenständiges Dateiobjekt, als Sie mit CFile, kann seine Basisklasse verwenden.Sie können CSocketFile auch mit allen archivbasierten MFC-Serialisierungsfunktionen verwenden.Da CSocketFile nicht die gesamte Funktionalität von CFile unterstützt, serialisieren einige Standard-MFC-Funktionen sind nicht kompatibel mit CSocketFile.Dies ist von der Klasse CEditView insbesondere.Versuchen Sie nicht, CEditView Daten über ein Objekt CArchive zu serialisieren, das einem Objekt unter Verwendung CSocketFileCEditView::SerializeRaw angefügt wird, Verwendung CEditView::Serialize stattdessen.Die SerializeRaw-Funktion erwartet das Dateiobjekt, um Funktionen, z Seek verfügen, das CSocketFile nicht über verfügt.

Wenn Sie CArchive mit CSocketFile und CSocket verwenden, treten unter Umständen eine Situation an, in der CSocket::Receive eine Schleife (durch PumpMessages(FD_READ)) auf die angeforderte Menge von Bytes wartenden eingibt.Dies ist, da Windows Sockets nur einen recv Aufruf pro FD_READ-Benachrichtigung gewähren, aber CSocketFile und CSocket können mehrere recv Aufrufe pro FD_READ.Wenn Sie ein FD_READ abrufen, wenn keine zu lesen, gibt Daten, hängt die Anwendung.Wenn Sie nie ein anderes FD_READ abrufen, beendet die Anwendung auf, über dem Socket zu kommunizieren.

Sie können dieses Problem wie folgt auflösen.In der OnReceive-Methode der Socketklasse, Aufruf CAsyncSocket::IOCtl(FIONREAD, ...), bevor Sie die Serialize-Methode der Nachrichtenklasse aufrufen, wenn die erwarteten vom Socket gelesen werden Daten, die Größe eines TCP-Paket überschreiten (maximale Übertragungseinheit des Netzwerkmediums, normalerweise mindestens 1096 Bytes).Wenn die Größe der verfügbaren Daten weniger als erforderlich ist, Sie warten alle empfangen werden nur Daten, und starten Sie dann den Lesevorgang.

Im folgenden Beispiel ist m_dwExpected die ungefähre Anzahl von Bytes, die der Benutzer erwartet, zu empfangen.Es wird davon ausgegangen, dass Sie es 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

Die C-Datei

CSocketFile

Anforderungen

Header: afxsock.h

Siehe auch

Referenz

CFile-Klasse

Hierarchien-Diagramm

CAsyncSocket-Klasse

CSocket-Klasse