Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
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
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