Sdílet prostřednictvím


Windows Sockets: Použití soketů s archivy

Tento článek popisuje programovací model CSocket. Třída CSocket poskytuje podporu soketů na vyšší úrovni abstrakce než třída CAsyncSocket. CSocket používá verzi protokolu serializace MFC k předávání dat do a z objektu soketu prostřednictvím mfc CArchive objektu. CSocket poskytuje blokování (při správě zpracování zpráv systému Windows na pozadí) a poskytuje přístup k CArchive, který spravuje mnoho aspektů komunikace, které byste museli udělat sami pomocí nezpracovaného rozhraní API nebo třídy CAsyncSocket.

Tip

Třídu CSocket můžete použít samostatně, jako pohodlnější verzi CAsyncSocket, ale nejjednodušší programovací model je použít CSocket s objektem CArchive .

Další informace o tom, jak funguje implementace soketů s archivy, naleznete v tématu Windows Sockets: How Sockets with Archives Work. Například kód naleznete v tématu Windows Sockets: Posloupnost operací a Windows Sockets: Příklad soketů používajících archivy. Informace o některých funkcích, které můžete získat odvozením vlastních tříd z tříd soketů, naleznete v tématu Windows Sockets: Odvození z tříd soketů.

Poznámka

Pokud píšete klientský program MFC ke komunikaci se zavedenými servery (mimo MFC), neodesílejte objekty jazyka C++ prostřednictvím archivu. Pokud server není aplikace MFC, která rozumí typům objektů, které chcete odeslat, nebude moci přijímat a deserializovat objekty. Související materiály týkající se komunikace s aplikacemi mimo MFC najdete také v článku Windows Sockets: Pořadí bajtů.

Programovací model CSocket

CSocket Použití objektu zahrnuje vytvoření a přidružení k několika objektům třídy MFC. V následujícím obecném postupu každý krok provádí jak serverový soket, tak klientský soket, s výjimkou kroku 3, ve kterém každý typ soketu vyžaduje jinou akci.

Tip

V době běhu se serverová aplikace obvykle začne připravit a "naslouchat", když klientská aplikace hledá připojení. Pokud server není připravený, když se klient pokusí připojit, obvykle potřebujete, aby se uživatelská aplikace pokusila připojit později.

Nastavení komunikace mezi soketem serveru a klientským soketem

  1. Vytvoření objektu CSocket

  2. Pomocí objektu vytvořte podkladový popisovač SOCKET .

    U objektu CSocket klienta byste normálně měli použít výchozí parametry k vytvoření, pokud nepotřebujete soket datagramu. U objektu CSocket serveru je nutné zadat port ve Create volání.

    Poznámka

    CArchive nefunguje se sokety datagramu. Pokud chcete použít CSocket pro soket datagramu, musíte použít třídu stejně, jako byste použili CAsyncSocket, to znamená bez archivu. Vzhledem k tomu, že datagramy jsou nespolehlivé (není zaručeno doručení a může být opakované nebo mimo posloupnost), nejsou kompatibilní se serializací prostřednictvím archivu. Očekáváte, že operace serializace bude spolehlivě a sekvencování dokončena. Pokud se pokusíte použít CSocket s objektem CArchive pro datagram, kontrolní výraz MFC selže.

  3. Pokud je soket klientem, zavolejte CAsyncSocket::Připojení pro připojení objektu soketu k serverovém soketu.

    nebo

    Pokud je soket serverem, zavolejte CAsyncSocket::Listen a začněte naslouchat pokusům o připojení z klienta. Po přijetí žádosti o připojení ji přijměte voláním CAsyncSocket::Accept.

    Poznámka

    Členová Accept funkce jako parametr přebírá odkaz na nový prázdný CSocket objekt. Tento objekt je nutné sestavit před voláním Accept. Pokud tento objekt soketu zmizí z rozsahu, připojení se zavře. Nevolejte Create pro tento nový objekt soketu.

  4. Vytvořte objekt CSocketFile a přidružte k CSocket němu objekt.

  5. Vytvořte objekt CArchive pro načítání (příjem) nebo ukládání (odesílání) dat. Archiv je přidružen k objektu CSocketFile .

    Mějte na paměti, že CArchive nefunguje se sokety datagramu.

  6. Pomocí objektu CArchive můžete předávat data mezi klientem a serverovými sokety.

    Mějte na paměti, že daný CArchive objekt přesouvá data pouze jedním směrem: buď pro načítání (příjem) nebo ukládání (odesílání). V některých případech použijete dva CArchive objekty: jeden pro odesílání dat, druhý pro příjem potvrzení.

    Po přijetí připojení a nastavení archivu můžete provádět takové úlohy, jako je ověřování hesel.

  7. Zničí objekty archivu, soketu a soketu.

    Poznámka

    Třída CArchive dodává IsBufferEmpty členovou funkci speciálně pro použití se třídou CSocket. Pokud vyrovnávací paměť obsahuje více datových zpráv, musíte například opakovat smyčku, dokud se nečtou všechny zprávy a vyrovnávací paměť se vymaže. V opačném případě může být vaše další oznámení o přijetí dat neomezeně zpožděné. Slouží IsBufferEmpty k zajištění, že načtete všechna data.

Článek Windows Sockets: Posloupnost operací znázorňuje obě strany tohoto procesu s ukázkovým kódem.

Další informace naleznete v tématu:

Viz také

Windows Sockets v prostředí MFC
CSocket::Create