Share via


CSocketFile-klasse

Opmerking

De Microsoft Foundation Classes-bibliotheek (MFC) wordt nog steeds ondersteund. We voegen echter geen functies meer toe of werken de documentatie bij.

Een CFile object dat wordt gebruikt voor het verzenden en ontvangen van gegevens via een netwerk via Windows Sockets.

Syntaxis

class CSocketFile : public CFile

Leden

Openbare constructors

Naam Description
CSocketFile::CSocketFile Maakt een CSocketFile object.

Opmerkingen

U kunt het CSocketFile object voor dit doel aan een CSocket object koppelen. U kunt het object ook toevoegen aan een CArchive object om het CSocketFile verzenden en ontvangen van gegevens te vereenvoudigen met behulp van MFC-serialisatie.

Als u gegevens wilt serialiseren (verzenden), voegt u deze in het archief in, waarmee lidfuncties worden aangeroepen CSocketFile om gegevens naar het CSocket object te schrijven. Als u gegevens wilt deserialiseren (ontvangen), extraheert u uit het archief. Dit zorgt ervoor dat het archief lidfuncties aanroept CSocketFile om gegevens van het CSocket object te lezen.

Aanbeveling

Naast het gebruik CSocketFile zoals hier beschreven, kunt u het gebruiken als een zelfstandig bestandsobject, net zoals u dat kunt, CFilede basisklasse. U kunt ook gebruikmaken CSocketFile van archiefgebaseerde MFC-serialisatiefuncties. Omdat CSocketFile niet alle functionaliteiten van CFileMFC worden ondersteund, zijn sommige standaard MFC-serialisatiefuncties niet compatibel met CSocketFile. Dit geldt met name voor de CEditView klas. U moet niet proberen gegevens te serialiseren CEditView via een CArchive object dat is gekoppeld aan een CSocketFile object met behulp van CEditView::SerializeRaw; gebruik CEditView::Serialize in plaats daarvan. De SerializeRaw functie verwacht dat het bestandsobject functies heeft, zoals Seek, die CSocketFile niet heeft.

Wanneer u CArchive met CSocketFile en CSocket, kunt u een situatie tegenkomen waarbij CSocket::Receive een lus (per PumpMessages(FD_READ)) wordt ingevoerd die wacht op de aangevraagde hoeveelheid bytes. Dit komt doordat Windows-sockets slechts één recv-aanroep per FD_READ melding toestaan, maar CSocketFile meerdere CSocket recv-aanroepen per FD_READ toestaan. Als u een FD_READ krijgt wanneer er geen gegevens worden gelezen, loopt de toepassing vast. Als u nooit een andere FD_READ krijgt, stopt de toepassing met communiceren via de socket.

U kunt dit probleem als volgt oplossen. Roep in de OnReceive methode van uw socketklasse CAsyncSocket::IOCtl(FIONREAD, ...) aan voordat u de Serialize methode van uw berichtklasse aanroept wanneer de verwachte gegevens uit de socket de grootte van één TCP-pakket overschrijden (maximale transmissie-eenheid van het netwerkmedium, meestal ten minste 1096 bytes). Als de grootte van de beschikbare gegevens kleiner is dan nodig is, wacht u tot alle gegevens zijn ontvangen en start u de leesbewerking alleen.

In het volgende voorbeeld m_dwExpected is het geschatte aantal bytes dat de gebruiker verwacht te ontvangen. Er wordt van uitgegaan dat u deze ergens anders in uw code declareert.

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
   }
}

Zie Windows Sockets in MFC, Windows Sockets: Sockets with Archives en Windows Sockets 2 API gebruiken voor meer informatie.

Overnamehiërarchie

CObject

CFile-

CSocketFile

Requirements

Koptekst: afxsock.h

CSocketFile::CSocketFile

Maakt een CSocketFile object.

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

Parameterwaarden

pSocket
De socket die aan het CSocketFile object moet worden gekoppeld.

bArchiveCompatible
Hiermee geeft u op of het bestandsobject moet worden gebruikt met een CArchive object. Geef ONWAAR alleen door als u het CSocketFile object op een zelfstandige manier wilt gebruiken, net als een zelfstandig CFile object, met bepaalde beperkingen. Met deze vlag wordt gewijzigd hoe het object dat aan het CSocketFile object is gekoppeld, CArchive de buffer beheert voor lezen.

Opmerkingen

Destructor van het object ontkoppelt zichzelf van het socketobject wanneer het object buiten het bereik valt of wordt verwijderd.

Opmerking

Een CSocketFile kan ook worden gebruikt als een (beperkt) bestand zonder een CArchive object. De parameter bArchiveCompatible van de CSocketFile constructor is standaard TRUE. Hiermee geeft u op dat het bestandsobject moet worden gebruikt met een archief. Als u het bestandsobject zonder archief wilt gebruiken, geeft u FALSE door in de parameter bArchiveCompatible .

In de modus 'archief compatibel' biedt een CSocketFile object betere prestaties en vermindert het gevaar van een 'impasse'. Er treedt een impasse op wanneer zowel de verzendende als ontvangende sockets op elkaar wachten of voor een algemene resource. Deze situatie kan optreden als het CArchive object werkt met de CSocketFile manier waarop het met een CFile object werkt. In CFilehet archief kan ervan worden uitgegaan dat als het minder bytes ontvangt dan het aangevraagde, het einde van het bestand is bereikt.

Gegevens CSocketFilezijn echter gebaseerd op berichten. De buffer kan meerdere berichten bevatten, dus het ontvangen van minder dan het aantal aangevraagde bytes impliceert niet dat het einde van het bestand wordt beëindigd. De toepassing blokkeert in dit geval niet zoals het kan en CFilekan berichten van de buffer blijven lezen totdat de buffer leeg is. De functie CArchive::IsBufferEmpty is handig voor het bewaken van de status van de buffer van het archief in een dergelijk geval.

Zie voor meer informatie over het gebruik van CSocketFile, de artikelen Windows Sockets: Sockets gebruiken met archieven en Windows Sockets: Voorbeeld van Sockets Using Archives.

Zie ook

CFile-klasse
Hiërarchiegrafiek
CAsyncsocket-klasse
CSocket-klasse