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 CFile
der Basisklasse. Sie können auch mit allen archivbasierten MFC-Serialisierungsfunktionen verwenden CSocketFile
. Da CSocketFile
nicht alle Funktionen unterstützt CFile
werden, 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 CArchive
CSocketFile
Objekt CEditView::SerializeRaw
verbunden ist; verwenden Sie CEditView::Serialize
stattdessen. Die SerializeRaw
Funktion erwartet, dass das Dateiobjekt Funktionen Seek
wie z CSocketFile
. B. nicht hat.
Bei Verwendung CArchive
mit CSocketFile
und CSocket
kö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 CSocketFile
CSocket
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
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 CSocketFile
Konstruktors 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 CFile
dem Archiv kann davon ausgegangen werden, dass das Ende der Datei erreicht wurde, wenn es weniger Bytes als angefordert empfängt.
Bei CSocketFile
Daten 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 CFile
ist, 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 CSocketFile
Sockets mit Archiven und Windows Sockets: Beispiel für Sockets Using Archives.
Siehe auch
CFile-Klasse
Hierarchiediagramm
CAsyncSocket-Klasse
CSocket-Klasse