Megosztás a következőn keresztül:


CSocketFile osztály

Megjegyzés:

A Microsoft Foundation Classes (MFC) könyvtár továbbra is támogatott. A továbbiakban azonban nem adunk hozzá funkciókat, és nem frissítjük a dokumentációt.

Az CFile adatok windowsos szoftvercsatornákon keresztüli hálózaton keresztüli küldéséhez és fogadásához használt objektum.

Szemantika

class CSocketFile : public CFile

Tagok

Nyilvános konstruktorok

Név Description
CSocketFile::CSocketFile Egy CSocketFile objektumot hoz létre.

Megjegyzések

Ehhez az objektumhoz csatolhatja az CSocketFile objektumot CSocket . Az objektumot az MFC szerializálásával is csatolhatja CSocketFile az objektumhoz CArchive , így egyszerűbbé teheti az adatok küldését és fogadását.

Az adatok szerializálásához (elküldéséhez) be kell szúrnia az archívumba, amely meghívja CSocketFile a tagfüggvényeket, hogy adatokat írjanak az CSocket objektumba. Az adatok deszerializálásához (fogadásához) kinyerheti az archívumból. Ez azt eredményezi, hogy az archívum meghívja CSocketFile a tagfüggvényeket, hogy adatokat olvasson be az CSocket objektumból.

Jótanács

Az itt leírtakon CSocketFile kívül önálló fájlobjektumként is használhatja, ugyanúgy, mint az alaposztályában CFile. Az archív MFC szerializálási függvényekkel is használható CSocketFile . Mivel CSocketFile nem támogatja az CFileösszes funkciót, egyes alapértelmezett MFC szerializálási függvények nem kompatibilisek a .CSocketFile Ez különösen igaz az CEditView osztályra. Ne próbálja meg szerializálni CEditView az adatokat egy CArchive objektumhoz CSocketFileCEditView::SerializeRawcsatolt objektumon keresztül, hanem használja CEditView::Serialize azt. A SerializeRaw függvény elvárja, hogy a fájlobjektum olyan függvényekkel rendelkezzen, mint például Seeka CSocketFile nem létező függvények.

A használat CArchiveCSocketFileCSocketsorán előfordulhat, hogy CSocket::Receive egy ciklust (by PumpMessages(FD_READ)) ad meg, amely a kért bájtmennyiségre vár. Ennek az az oka, hogy a Windows-szoftvercsatornák csak egy recv hívást engedélyeznek FD_READ értesítésenként, de CSocketFileCSocket több recv-hívást is engedélyeznek FD_READ. Ha FD_READ kap, ha nincs olvasható adat, az alkalmazás lefagy. Ha soha nem kap újabb FD_READ, az alkalmazás nem kommunikál a szoftvercsatornán keresztül.

Ezt a problémát az alábbiak szerint oldhatja meg. OnReceive A szoftvercsatornaosztály metódusában hívja meg CAsyncSocket::IOCtl(FIONREAD, ...) az Serialize üzenetosztály metódusát, ha a szoftvercsatornából beolvasandó várt adatok mérete meghaladja az egy TCP-csomag méretét (a hálózati adathordozó maximális átviteli egysége, általában legalább 1096 bájt). Ha a rendelkezésre álló adatok mérete kisebb a szükségesnél, várja meg az összes adat fogadását, és csak ezután indítsa el az olvasási műveletet.

Az alábbi példában m_dwExpected a felhasználó által várt bájtok hozzávetőleges száma látható. Feltételezzük, hogy a kódot máshol deklarálja.

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

További információ: Windows Sockets in MFC, Windows Sockets: Using Sockets with Archives, valamint Windows Sockets 2 API.

Öröklési hierarchia

CObject

CFile

CSocketFile

Requirements

Fejléc: afxsock.h

CSocketFile::CSocketFile

Egy CSocketFile objektumot hoz létre.

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

Paraméterek

pSocket
Az objektumhoz csatolandó CSocketFile szoftvercsatorna.

bArchiveCompatible
Megadja, hogy a fájlobjektum használható-e objektummal CArchive . Csak akkor adja át a HAMIS értéket, ha önállóan szeretné használni az CSocketFile objektumot, mint egy különálló CFile objektumot, bizonyos korlátozásokkal. Ez a jelző módosítja, hogy az CArchive objektumhoz CSocketFile csatolt objektum hogyan kezeli a puffert olvasáshoz.

Megjegyzések

Az objektum destruktora leválasztja magát a szoftvercsatorna-objektumról, amikor az objektum kiesik a hatókörből, vagy törlődik.

Megjegyzés:

Az A CSocketFile objektum nélküli CArchive (korlátozott) fájlként is használható. Alapértelmezés szerint a CSocketFile konstruktor bArchiveCompatible paramétere IGAZ. Ez azt határozza meg, hogy a fájlobjektum egy archívumhoz használható. Ha a fájlobjektumot archívum nélkül szeretné használni, adja át a FALSE értéket a bArchiveCompatible paraméterben.

Az "archív kompatibilis" módban az CSocketFile objektumok jobb teljesítményt nyújtanak, és csökkentik a "holtpont" veszélyét. Holtpont akkor fordul elő, ha a küldő és a fogadó szoftvercsatornák egymásra vagy egy közös erőforrásra várnak. Ez a helyzet akkor fordulhat elő, ha az CArchive objektum az objektumhoz CFile hasonlóan működöttCSocketFile. Ezzel CFileegyütt az archívum feltételezheti, hogy ha kevesebb bájtot kap, mint amennyit kért, a fájl vége el lett érve.

Az CSocketFileadatok azonban üzenetalapúak; a puffer több üzenetet is tartalmazhat, így a kért bájtok számánál kevesebb fogadás nem jelenti a fájl végét. Az alkalmazás ebben az esetben nem tiltja le, ahogy az lehetséges CFile, és folytathatja az üzenetek olvasását a pufferből, amíg a puffer üres nem lesz. A CArchive::IsBufferEmpty függvény hasznos az archívum pufferének állapotának monitorozásához ilyen esetben.

További információ a használatáról CSocketFile: Windows Sockets: Using Sockets with Archives and Windows Sockets: Example of Sockets Using Archives.

Lásd még

CFile osztály
hierarchiadiagram
CAsyncSocket osztály
CSocket osztály