CSocketFile – třída
Objekt CFile
používaný k odesílání a přijímání dat přes síť prostřednictvím rozhraní Windows Sockets.
Syntaxe
class CSocketFile : public CFile
Členové
Veřejné konstruktory
Název | Popis |
---|---|
CSocketFile::CSocketFile | CSocketFile Vytvoří objekt. |
Poznámky
Objekt můžete pro tento účel připojit CSocketFile
k objektu CSocket
. Objekt můžete také připojit CSocketFile
k objektu CArchive
a zjednodušit tak odesílání a přijímání dat pomocí serializace MFC.
Chcete-li serializovat (odesílat) data, vložte je do archivu, který volá CSocketFile
členské funkce k zápisu dat do objektu CSocket
. Chcete-li deserializovat (přijímat) data, extrahujete z archivu. To způsobí, že archiv zavolá CSocketFile
členské funkce ke čtení dat z objektu CSocket
.
Tip
Kromě použití CSocketFile
, jak je zde popsáno, můžete jej použít jako samostatný soubor objekt, stejně jako můžete s CFile
jeho základní třídou. Můžete také použít CSocketFile
s libovolnými funkcemi serializace MFC založené na archivu. Vzhledem k tomu CSocketFile
, že nepodporuje všechny CFile
funkce, některé výchozí funkce serializace MFC nejsou kompatibilní s CSocketFile
. To platí zejména pro CEditView
třídu. Neměli byste se pokoušet serializovat CEditView
data prostřednictvím objektu CArchive
připojeného k objektu CSocketFile
pomocí ; CEditView::SerializeRaw
použijte CEditView::Serialize
místo toho. Funkce SerializeRaw
očekává, že objekt souboru bude mít funkce, například Seek
, které CSocketFile
nemají.
Při použití CArchive
s CSocketFile
a CSocket
, může dojít k situaci, kdy CSocket::Receive
vstoupí do smyčky (by PumpMessages(FD_READ)
) čekání na požadované množství bajtů. Je to proto, že sokety Windows umožňují pouze jedno volání recv na FD_READ oznámení, ale CSocketFile
CSocket
povoluje více volání recv na FD_READ. Pokud získáte FD_READ, když nejsou k dispozici žádná data ke čtení, aplikace přestane reagovat. Pokud nikdy nedostanete další FD_READ, aplikace přestane komunikovat přes soket.
Tento problém můžete vyřešit následujícím způsobem. OnReceive
V metodě třídy soketů volejte CAsyncSocket::IOCtl(FIONREAD, ...)
před voláním Serialize
metody třídy zpráv, když očekávaná data, která se mají číst ze soketu, překročí velikost jednoho paketu TCP (maximální přenosová jednotka síťového média, obvykle nejméně 1096 bajtů). Pokud je velikost dostupných dat menší, než je potřeba, počkejte na přijetí všech dat a teprve pak spusťte operaci čtení.
V následujícím příkladu je přibližný počet bajtů, m_dwExpected
které uživatel očekává. Předpokládá se, že ho deklarujete jinde ve svém kódu.
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
}
}
Další informace naleznete v tématu Windows Sockets in MFC, Windows Sockets: Using Sockets with Archives, as Windows Sockets 2 API.
Hierarchie dědičnosti
CSocketFile
Požadavky
Hlavička: afxsock.h
CSocketFile::CSocketFile
CSocketFile
Vytvoří objekt.
explicit CSocketFile(
CSocket* pSocket,
BOOL bArchiveCompatible = TRUE);
Parametry
pSocket
Soket pro připojení k objektu CSocketFile
.
bArchiveCompatible
Určuje, zda se objekt souboru používá s objektem CArchive
. Předejte nePRAVDA pouze v případě, že chcete CSocketFile
použít objekt samostatným způsobem, stejně jako u samostatného CFile
objektu s určitými omezeními. Tento příznak změní způsob správy CArchive
vyrovnávací paměti objektu připojeného k objektu CSocketFile
pro čtení.
Poznámky
Destruktor objektu se při výpadku oboru nebo odstranění objektu oddělí od objektu soketu.
Poznámka:
A CSocketFile
lze také použít jako (omezený) soubor bez objektu CArchive
. Ve výchozím nastavení CSocketFile
je parametr bArchiveCompatible konstruktoru TRUE. Určuje, že se objekt souboru používá s archivem. Chcete-li použít objekt souboru bez archivu, předejte hodnotu FALSE v parametru bArchiveCompatible .
V režimu CSocketFile
"kompatibilní s archivem" poskytuje objekt lepší výkon a snižuje nebezpečí "zablokování". K vzájemnému zablokování dochází v případě, že odesílající i přijímající sokety čekají na sebe nebo pro společný prostředek. K této situaci může dojít v případě, CArchive
že objekt pracoval CSocketFile
se způsobem, jakým objekt funguje s objektem CFile
. V CFile
případě, že archiv může předpokládat, že pokud obdrží méně bajtů, než požaduje, byl dosažen konec souboru.
Data CSocketFile
jsou však založená na zprávách; vyrovnávací paměť může obsahovat více zpráv, takže příjem méně než požadovaný počet bajtů neznamená konec souboru. Aplikace v tomto případě neblokuje, protože může CFile
obsahovat a může pokračovat ve čtení zpráv z vyrovnávací paměti, dokud nebude vyrovnávací paměť prázdná. Funkce CArchive::IsBufferEmpty je užitečná pro monitorování stavu vyrovnávací paměti archivu v takovém případě.
Další informace o použití CSocketFile
naleznete v článcích Windows Sockets: Using Sockets with Archives and Windows Sockets: Example of Sockets Using Archives.
Viz také
CFile – třída
Graf hierarchie
CAsyncSocket – třída
CSocket – třída