Sdílet prostřednictvím


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 CFilejeho 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 CFilefunkce, 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::SerializeRawpouž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

Objekt CObject

CFile

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 CFilepřípadě, že archiv může předpokládat, že pokud obdrží méně bajtů, než požaduje, byl dosažen konec souboru.

Data CSocketFilejsou 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 CFileobsahovat 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í CSocketFilenaleznete 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