Sdílet prostřednictvím


Windows Sockets: Jak pracují sokety s archivy

Tento článek vysvětluje, jak CSocket objekt, CSocketFile objekt a CArchive objektu jsou kombinovány za účelem zjednodušení odesílání a přijímání dat prostřednictvím soketů systému Windows.

V článku Windows Sockets: příklad z soketů pomocí archivy představuje PacketSerialize funkce.Objekt archivu PacketSerialize příklad funguje podobně jako archiv objektu předaný do knihovny MFC serializovatelnou funkce.Zásadní rozdíl je, že pro zásuvky, archiv připojen není standard CFile objektu (obvykle přidruženého souboru na disku) ale až CSocketFile objektu.Místo připojení k souboru na disku, CSocketFile objektu připojí k CSocket objektu.

A CArchive objekt spravuje vyrovnávací paměti.Při zaplnění vyrovnávací paměti pro ukládání (odeslání) archivu, přidružené CFile objektu zapíše obsah do vyrovnávací paměti.Vyprazdňování vyrovnávací paměti z archivu připojeny k soketu je ekvivalentní k odeslání zprávy.Při zaplnění vyrovnávací paměti pro načtení (příjem) archiv CFile objekt zastaví čtení, dokud není vyrovnávací paměť je opět k dispozici.

Třída CSocketFile je odvozen od CFile, ale nepodporuje CFile členské funkce, například funkce umístění (Seek, GetLength, SetLengtha tak dále), funkce uzamčení (LockRange, UnlockRange), nebo GetPosition funkce.Všechny CSocketFile objektu musíte udělat je zápis nebo čtení sekvence bajtů z přidruženého nebo CSocket objektu.Vzhledem k tomu, že soubor není zapojen, operace, jako Seek a GetPosition žádný smysl.CSocketFileje odvozen od CFile, takže ho normálně zdědili by všechny tyto členské funkce.Aby se tomu zabránilo, podporován CFile přepsat členské funkce v CSocketFile vyvolat CNotSupportedException.

CSocketFile Objekt volání členské funkce jeho CSocket objekt, který chcete odeslat nebo přijmout data.

Následující obrázek znázorňuje vztahy mezi těmito objekty na obou stranách komunikace.

CArchive, CSocketFile a CSocket

CArchive, CSocketFile a CSocket

Účelem této zjevné složitosti je vás chrání před ošetřením podrobné informace o soketu nezbytnost.Vytvoření soketu, soubor a archivace 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 ve skutečnosti stát dvou objektů: někdy asynchronní (obvyklý stav) a někdy synchronní.Ve stavu asynchronní soketu může přijímat asynchronní oznámení z rozhraní framework.Během operace, například příjem nebo odesílání dat se však synchronní soketu.To znamená, že soket obdrží další asynchronní oznámení až do dokončení asynchronní operace.Vzhledem k tomu, že se Přepíná režimy, můžete, například provést něco jako následující:

void CMySocket::OnReceive(int nErrorCode)
{
   if (0 == nErrorCode)
   {
      CSocketFile file(this);
      CArchive ar(&file, CArchive::load);
      CString str;

      ar >> str;
   }
}

Pokud CSocket nebyly implementovány jako dvoustavového objektu je možné přijímat další oznámení pro stejný druh události během předchozího oznámení bylo zpracování.Například můžete získat OnReceive při zpracování oznámení OnReceive.Ve výše uvedeném fragmentu kódu extrahování str z archivu, které by mohlo vést k rekurzi.Tím přepnete mezi státy, CSocket brání tím, že další oznámení rekurze.Obecně platí, žádná oznámení v rámci oznámení.

[!POZNÁMKA]

A CSocketFile lze použít také jako soubor (omezené), aniž by CArchive objektu.Standardně CSocketFile konstruktoru bArchiveCompatible je parametr TRUE.To určuje, že objekt souboru pro použití s archiv.Chcete-li použít objekt bez archivního souboru, FALSE v bArchiveCompatible parametr.

V režimu "archiv kompatibilní" CSocketFile objekt poskytuje lepší výkon a snižuje nebezpečí "zablokování". Příjem a odesílání sockets jsou čekání na sebe, nebo čekání na společný zdroj, dojde k zablokování.Tato situace může nastat, pokud CArchive objekt pracovali CSocketFile tak, jak tomu u CFile objektu.S CFile, archiv lze předpokládat, že pokud obdrží menším počtem bajtů než je požadováno, konec souboru bylo dosaženo.S CSocketFile, dat je však zpráva založena; vyrovnávací paměti může obsahovat více zpráv, přijímání méně než počet bajtů neznamená konec souboru.Aplikace v tomto případě neblokuje což se může stát s CFile, a můžete pokračovat v čtení zpráv z vyrovnávací paměti, dokud není vyrovnávací paměť prázdná.IsBufferEmpty funkce CArchive je vhodný pro sledování stavu archivu vyrovnávací paměti v takovém případě.

Další informace naleznete v tématu Windows Sockets: pomocí soketů s archivy

Viz také

Referenční dokumentace

CObject::Serialize

Koncepty

Windows sockets v prostředí MFC