Windows Sockets: Použití třídy CAsyncSocket
Tento článek vysvětluje, jak používat třídu CAsyncSocket
. Tato třída zapouzdřuje rozhraní API rozhraní Windows Sockets na velmi nízké úrovni. CAsyncSocket
je určen programátoři, kteří podrobně znají síťovou komunikaci, ale chtějí, aby bylo možné volat zpětná volání pro oznámení síťových událostí. Na základě tohoto předpokladu poskytuje tento článek pouze základní instrukce. Pravděpodobně byste měli zvážit použití CAsyncSocket
, pokud chcete, aby rozhraní Windows Sockets snadno řešilo více síťových protokolů v aplikaci MFC, ale nechcete obětovat flexibilitu. Můžete se také cítit, že můžete dosáhnout lepší efektivity programováním komunikace přímo sami, než byste mohli použít obecnější alternativní model třídy CSocket
.
CAsyncSocket
je dokumentován v referenční dokumentaci MFC. Visual C++ také dodává specifikaci rozhraní Windows Sockets umístěnou v sadě Windows SDK. Podrobnosti jsou vám ponechány. Visual C++ neposkytuje ukázkovou aplikaci pro CAsyncSocket
.
Pokud nejste vysoce znalí síťové komunikace a chcete jednoduché řešení, použijte třídu CSocket
s objektem CArchive
. Další informace najdete v tématu Windows Sockets: Použití soketů s archivy .
Tento článek se věnuje následujícím tématům:
Vytvoření a použití objektu
CAsyncSocket
Vytvoření a použití CAsyncSocket
Použití CAsyncSocket
CAsyncSocket
Vytvořte objekt a pomocí objektu vytvořte podkladovýSOCKET
popisovač.Vytvoření soketu se řídí vzorem MFC dvoufázové konstrukce.
Příklad:
CAsyncSocket sock; sock.Create(); // Use the default parameters
nebo
CAsyncSocket *pSocket = new CAsyncSocket; int nPort = 27; pSocket->Create(nPort, SOCK_DGRAM);
První konstruktor výše vytvoří
CAsyncSocket
objekt v zásobníku. Druhý konstruktor vytvoříCAsyncSocket
na haldě. PrvníCreate
volání výše používá výchozí parametry k vytvoření soketu streamu. DruhéCreate
volání vytvoří soket datagramu se zadaným portem a adresou. (V obou verzích můžete použít některouCreate
z metod konstrukce.)Parametry, které mají
Create
být:"port": krátké celé číslo.
Pro serverový soket musíte zadat port. U klientského soketu obvykle přijímáte výchozí hodnotu tohoto parametru, která umožňuje rozhraní Windows Sockets vybrat port.
Typ soketu:
SOCK_STREAM
(výchozí) neboSOCK_DGRAM
."Adresa" soketu, jako
"ftp.microsoft.com"
"128.56.22.8"
je nebo .Toto je vaše IP adresa v síti. Pravděpodobně budete vždy spoléhat na výchozí hodnotu tohoto parametru.
Výrazy "port" a "adresa soketu" jsou vysvětleny v rozhraní Windows Sockets: Porty a adresy soketů.
Pokud je soket klientem, připojte objekt soketu k serverovém soketu pomocí .
CAsyncSocket::Connect
nebo
Pokud je soket serverem, nastavte soket tak, aby začal naslouchat (s
CAsyncSocket::Listen
) pro pokusy o připojení z klienta. Po přijetí žádosti o připojení ji přijměte sCAsyncSocket::Accept
.Po přijetí připojení můžete provádět úkoly, jako je ověřování hesel.
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. Tento nový objekt soketu nevolejteCreate
. Příklad najdete v článku Windows Sockets: Posloupnost operací.Komunikaci s jinými sokety provedete voláním
CAsyncSocket
členských funkcí objektu, které zapouzdřují funkce rozhraní API rozhraní Windows Sockets.Podívejte se na specifikaci a třídu
CAsyncSocket
rozhraní Windows Sockets v referenčních informacích mfc.CAsyncSocket
Zničit objekt.Pokud jste vytvořili objekt soketu v zásobníku, jeho destruktor je volána, když obsahující funkce zmizí z rozsahu. Pokud jste vytvořili objekt soketu na haldě pomocí operátoru
new
, zodpovídáte za použití operátorudelete
k zničení objektu.Destruktor volá členskou
Close
funkci objektu před zničením objektu.
Příklad této sekvence v kódu (ve skutečnosti pro CSocket
objekt) najdete v tématu Windows Sockets: Posloupnost operací.
Vaše odpovědnosti s CAsyncSocket
Při vytváření objektu třídy CAsyncSocket
objekt zapouzdřuje obslužné rutiny systému Windows SOCKET
a poskytuje operace na daném popisovači. Při použití CAsyncSocket
musíte řešit všechny problémy, se kterými se můžete setkat, pokud rozhraní API používáte přímo. Příklad:
Scénáře "Blokování".
Rozdíly pořadí bajtů mezi odesílajícími a přijímajícími počítači
Převod mezi řetězci unicode a vícebajtové znakové sady (MBCS)
Definice těchto termínů a dalších informací naleznete v tématu Windows Sockets: Blocking, Windows Sockets: Byte Ordering, Windows Sockets: Converting Strings.
I přes tyto problémy může být třída CAsyncSocket
pro vás správnou volbou, pokud vaše aplikace vyžaduje veškerou flexibilitu a kontrolu, kterou můžete získat. Pokud ne, zvažte místo toho použití třídy CSocket
. CSocket
skryje mnoho podrobností od vás: pumpuje zprávy systému Windows během blokujících volání a poskytuje přístup k CArchive
, který spravuje rozdíly v pořadí bajtů a převod řetězců za vás.
Další informace naleznete v tématu: