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 |
---|---|
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
CSocketFile
Požadavky
Záhlaví: afxsock.h