Sdílet prostřednictvím


Třída CSocketFile

A CFile objektu se používá pro odesílání a příjem dat v síti prostřednictvím rozhraní Windows Sockets.

class CSocketFile : public CFile

Členy

Veřejné konstruktory

Název

Description

CSocketFile::CSocketFile

Konstrukce CSocketFile objektu.

Poznámky

Můžete připojit CSocketFile k objektu CSocket objektu pro tento účel.Můžete také a obvykle, připojit CSocketFile objekt na CArchive objektu zjednodušit odesílání a přijímání dat pomocí serializace MFC.

Serializace dat (odesílání), vložení do archivu, který volá CSocketFile funkce členů zapisovat data CSocket objektu.K rekonstrukci (příjem) dat, extrahovat z archivu.To způsobí archivu volání CSocketFile funkce členů čtení dat z CSocket objektu.

Tip

Kromě použití CSocketFile zde popsaným způsobem můžete jako samostatný soubor objekt, stejně jako s CFile , jeho základní třída.Můžete také použít CSocketFile s všechny funkce archivace založené serializace MFC.Protože CSocketFile nepodporuje všechny CFile jeho funkce některé výchozí MFC serializovat funkcí nejsou kompatibilní s CSocketFile .To platí zejména pro CEditView třídy.Nezkoušejte serializovat CEditView data prostřednictvím CArchive objekt připojen k CSocketFile objektu pomocí CEditView::SerializeRaw ; použít CEditView::Serialize místo. SerializeRaw Funkce očekává objektu souboru mají funkce, jako například Seek , že CSocketFile nemá.

Při použití CArchive s CSocketFile a CSocket , může nastat situace, kdy CSocket::Receive ve smyčce (podle PumpMessages(FD_READ)) čeká na požadované množství bajtů.Totiž pouze jedno volání přijmout jedno oznámení FD_READ povolit rozhraní Windows sockets, ale CSocketFile a CSocket povolit více volání přijmout za FD_READ.Pokud při nejsou žádná data pro čtení FD_READ, aplikace přestane reagovat.Pokud nikdy jiného FD_READ, přestane aplikace komunikaci přes soket.

Tento problém lze vyřešit následujícím způsobem.V OnReceive metoda třídy socket, volání CAsyncSocket::IOCtl (FIONREAD,...) než zavoláte Serialize metoda třídy zpráv při čtení ze soketu očekávaná data přesahuje jeden paket TCP (maximum transmission unit síťové médium, zpravidla nejméně 1096 bajtů).Pokud je velikost dat k dispozici méně než potřebné, počkejte všechna data příjmu a teprve potom spusťte operaci čtení.

V následujícím příkladu m_dwExpected je přibližný počet bajtů, které uživatel očekává.Předpokládá se, že deklarujete ji jinde v 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 v MFC, rozhraní Windows Sockets: pomocí soketů s archivy, stejně jako Rozhraní API Windows Sockets 2.

Hierarchii dědičnosti

CObject

CFile

CSocketFile

Požadavky

Záhlaví: afxsock.h

Viz také

Referenční dokumentace

Třída CFile

Graf hierarchie

Třída CAsyncSocket

Třída CSocket