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
Vytvoření objektu CSocket
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 objektuCSocket
serveru je nutné zadat port veCreate
volání.Poznámka
CArchive
nefunguje se sokety datagramu. Pokud chcete použítCSocket
pro soket datagramu, musíte použít třídu stejně, jako byste použiliCAsyncSocket
, 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žítCSocket
s objektemCArchive
pro datagram, kontrolní výraz MFC selže.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ímAccept
. Pokud tento objekt soketu zmizí z rozsahu, připojení se zavře. NevolejteCreate
pro tento nový objekt soketu.Vytvořte objekt CSocketFile a přidružte k
CSocket
němu objekt.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.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 dvaCArchive
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.
Zničí objekty archivu, soketu a soketu.
Poznámka
Třída
CArchive
dodáváIsBufferEmpty
členovou funkci speciálně pro použití se třídouCSocket
. 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: