Rozhraní Windows Sockets: Jak pracovat s archivy Sockets
Tento článek vysvětluje, jak CSocket objektu, CSocketFile objektu a CArchive objektu jsou kombinovány zjednodušit odesílání a příjem dat prostřednictvím soketů systému Windows.
V článku rozhraní Windows Sockets: příklad z Sockets pomocí archivy představuje PacketSerialize funkce.Objekt v archivu PacketSerialize příklad pracuje podobně jako objekt archivu MFC předána Serialize funkce.Základní rozdíl je, že pro sokety, archiv připojen není standardní CFile objekt (obvykle přidružený soubor na disku) ale na CSocketFile objektu.Místo připojení souboru na disku CSocketFile objektu připojí k CSocket objektu.
A CArchive objektu spravuje vyrovnávací paměti.Při zaplnění vyrovnávací paměti pro ukládání archivu (odeslání), spojen CFile objektu vytvoří obsah do vyrovnávací paměti.Vyprazdňování vyrovnávací paměti archiv připojené k soketu je ekvivalentní odesílání zprávy.Při zaplnění vyrovnávací paměť načítání (příjem) archivu CFile objekt přestane čtení, dokud vyrovnávací paměti je opět k dispozici.
Třída CSocketFile odvozuje z CFile, ale nepodporuje CFile členské funkce, například funkce umístění (Seek, GetLength, SetLength, atd), funkce uzamčení (LockRange, UnlockRange), nebo GetPosition funkce.Všechny CSocketFile objektu, musíte provést zápis nebo čtení bajtů z přidružených nebo sekvence CSocket objektu.Protože soubor není zapojen, operace, například Seek a GetPosition žádný smysl.CSocketFileje odvozen z CFile, takže jej obvykle zdědili by všechny tyto funkce členů.K tomu zabránit, nepodporovaný CFile funkce členů jsou potlačeny v CSocketFile má být vyvolána CNotSupportedException.
CSocketFile Objekt volá členské funkce jeho CSocket objekt odeslat nebo přijmout data.
Následující obrázek znázorňuje vztahy mezi objekty na obou stranách komunikace.
CArchive, CSocketFile a CSocket
Účelem této složitosti zjevné je můžete odstínit od nezbytnost Správa podrobnosti soketu sami.Vytvoření soketu a soubor archivu a začněte odesílající nebo přijímající data vložení do archivu nebo extrahování z archivu.CArchive, CSocketFile, a CSocket spravovat podrobnosti na pozadí.
A CSocket objekt je ve skutečnosti objekt stát dvě: někdy asynchronní (obvyklý stav) a někdy synchronní.Ve stavu asynchronní soket dostávat upozornění asynchronní z rámce.Během operace, například příjem nebo odesílání dat se však synchronní soketu.To znamená, že soket upozornění nebudou zobrazovat žádné další asynchronní dokud synchronní operace byla dokončena.Protože režimy, přepne, například máte přibližně takto:
void CMySocket::OnReceive(int nErrorCode)
{
if (0 == nErrorCode)
{
CSocketFile file(this);
CArchive ar(&file, CArchive::load);
CString str;
ar >> str;
}
}
Pokud CSocket není implementována jako dvě stav objektu je možné přijímat dodatečná oznámení pro stejný druh události během předchozího oznámení bylo zpracování.Například může získat OnReceive při zpracování oznámení OnReceive.Ve výše uvedeném fragmentu kódu extrahování str z archivu může vést k rekurzi.Přepnutím státy, CSocket tím, že další oznámení zabraňuje rekurze.Obecné pravidlo je žádná oznámení, v oznámení.
[!POZNÁMKA]
A CSocketFile lze použít také jako soubor bez (omezené) CArchive objektu.Standardně CSocketFile v konstruktoru bArchiveCompatible je parametr TRUE.Určuje soubor objektu je určena pro archiv.Chcete-li použít soubor objektu bez archiv FALSE v bArchiveCompatible parametr.
V režimu "archivu kompatibilní" CSocketFile objektu poskytuje lepší výkon a snižuje nebezpečí "zablokování". Při odesílání a příjem sokety jsou čekání na sebe nebo čeká na prostředek společné dojde k zablokování.Tato situace může nastat, pokud CArchive objektu pracovali CSocketFile tak, jak je tomu u CFile objektu.S CFile, archiv může předpokládat, že pokud obdrží menším počtem bajtů než je požadováno, konce souboru bylo dosaženo.S CSocketFile, dat je však zpráva založena; vyrovnávací paměť může obsahovat více zpráv, tak přijímání méně než počet bajtů neznamená konec souboru.Jak může být s neblokuje aplikace v tomto případě CFile, a může pokračovat, dokud není vyrovnávací paměť prázdná čtení zpráv z vyrovnávací paměti.IsBufferEmpty ve funkci CArchive je užitečné pro sledování stavu vyrovnávací paměti archivu v takovém případě.
Další informace naleznete v rozhraní Windows Sockets: pomocí soketů s archivy