Windows Sockets: Posloupnost operací
Tento článek ukazuje souběžnou posloupnost operací pro serverový soket a klientský soket. Vzhledem k tomu, že sokety používají CArchive
objekty, jsou nutně stream sokety.
Posloupnost operací pro komunikaci soketů streamu
Až do bodu vytvoření objektu CSocketFile
je následující sekvence přesná (s několika rozdíly parametrů) pro obě CAsyncSocket
a CSocket
. Od tohoto okamžiku je sekvence výhradně pro CSocket
. Následující tabulka znázorňuje posloupnost operací pro nastavení komunikace mezi klientem a serverem.
Nastavení komunikace mezi serverem a klientem
Server | Klient |
---|---|
// construct a socket CSocket sockSrvr; |
// construct a socket CSocket sockClient; |
// create the SOCKET sockSrvr.Create(nPort); 1,2 |
// create the SOCKET sockClient.Create( ); 2 |
// start listening sockSrvr.Listen( ); |
|
// seek a connection sockClient.Connect(strAddr, nPort); 3,4 |
|
// construct a new, empty socket CSocket sockRecv; // accept connection sockSrvr.Accept( sockRecv ); 5 |
|
// construct file object CSocketFile file(&sockRecv); |
// construct file object CSocketFile file(&sockClient); |
// construct an archive CArchive arIn(&file, CArchive::load); nebo CArchive arOut(&file, CArchive::store); - nebo obojí - |
// construct an archive CArchive arIn(&file, CArchive::load); nebo CArchive arOut(&file, CArchive::store); - nebo obojí - |
// use the archive to pass data: arIn >> dwValue; nebo arOut << dwValue; 6 |
// use the archive to pass data: arIn >> dwValue; nebo arOut << dwValue; 6 |
Kde nPort je číslo portu. Podrobnosti o portech najdete v tématu Windows Sockets: Porty a adresy soketů .
Server musí vždy zadat port, aby se klienti mohli připojit. Volání
Create
někdy také určuje adresu. Na straně klienta použijte výchozí parametry, které mfc vyzve k použití libovolného dostupného portu.Kde nPort je číslo portu a strAddr je adresa počítače nebo IP adresa.
Adresy počítačů můžou mít několik forem: "ftp.microsoft.com", "microsoft.com". IP adresy používají tečkované číslo ve tvaru 127.54.67.32. Funkce
Connect
zkontroluje, jestli je adresa tečkované číslo (i když nekontroluje, jestli je číslo platným počítačem v síti). Pokud ne,Connect
předpokládá název počítače jednoho z ostatních formulářů.Při volání
Accept
na straně serveru předáte odkaz na nový objekt soketu. Nejprve je nutné vytvořit tento objekt, ale nevolejteCreate
ho. Mějte na paměti, že pokud tento objekt soketu přestane být obor, připojení se zavře. MFC připojí nový objekt k úchytu SOKET . Soket můžete vytvořit v zásobníku, jak je znázorněno, nebo v haldě.Archiv a soubor soketu se zavřou, když vyjdou mimo rozsah. Destruktor objektu soketu také volá funkci Zavřít člen pro objekt soketu, když objekt přejde mimo rozsah nebo je odstraněn.
Další poznámky ke sekvenci
Posloupnost volání zobrazených v předchozí tabulce je určena pro soket streamu. Sokety datagramu, které jsou bez připojení, nevyžadují volání CAsyncSocket::Připojení, Listen a Accept (i když můžete volitelně použítConnect
). Místo toho pokud používáte třídu CAsyncSocket
, sokety datagramu CAsyncSocket::SendTo
používají členské funkce.ReceiveFrom
(Pokud používáte Connect
s soketem datagramu, použijete Send
a Receive
.) Vzhledem k tomu CArchive
, že nefunguje s datagramy, nepoužívejte CSocket
s archivem, pokud je soket datagram.
CSocketFile nepodporuje všechny CFile
funkce; CFile
členy, jako Seek
je například , které nemají smysl pro komunikaci soketů, nejsou k dispozici. Z tohoto důvodu některé výchozí funkce MFC Serialize
nejsou kompatibilní s CSocketFile
. To platí zejména pro CEditView
třídu. Neměli byste se pokoušet serializovat CEditView
data prostřednictvím objektu CArchive
připojeného k objektu CSocketFile
pomocí ; CEditView::SerializeRaw
použijte CEditView::Serialize
místo toho (není zdokumentováno). Funkce SerializeRaw očekává, že objekt souboru bude mít funkce, například Seek
, které CSocketFile
nepodporují.
Další informace naleznete v tématu:
Viz také
Windows Sockets v prostředí MFC
CSocket – třída
CAsyncSocket::Create
CAsyncSocket::Close