Sdílet prostřednictvím


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
  1. Kde nPort je číslo portu. Podrobnosti o portech najdete v tématu Windows Sockets: Porty a adresy soketů .

  2. 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.

  3. Kde nPort je číslo portu a strAddr je adresa počítače nebo IP adresa.

  4. 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ářů.

  5. Při volání Accept na straně serveru předáte odkaz na nový objekt soketu. Nejprve je nutné vytvořit tento objekt, ale nevolejte Create 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ě.

  6. 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 CFilefunkce; CFile členy, jako Seekje 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::SerializeRawpouž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