Windows Sockets: Sequence of Operations
This article illustrates, side by side, the sequence of operations for a server socket and a client socket. Because the sockets use CArchive
objects, they are necessarily stream sockets.
Sequence of Operations for a Stream Socket Communication
Up to the point of constructing a CSocketFile
object, the following sequence is accurate (with a few parameter differences) for both CAsyncSocket
and CSocket
. From that point on, the sequence is strictly for CSocket
. The following table illustrates the sequence of operations for setting up communication between a client and a server.
Setting Up Communication Between a Server and a Client
Server | Client |
---|---|
// 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); -or- CArchive arOut(&file, CArchive::store); - or Both - |
// construct an archive CArchive arIn(&file, CArchive::load); -or- CArchive arOut(&file, CArchive::store); - or Both - |
// use the archive to pass data: arIn >> dwValue; -or- arOut << dwValue; 6 |
// use the archive to pass data: arIn >> dwValue; -or- arOut << dwValue; 6 |
Where nPort is a port number. See Windows Sockets: Ports and Socket Addresses for details about ports.
The server must always specify a port so clients can connect. The
Create
call sometimes also specifies an address. On the client side, use the default parameters, which ask MFC to use any available port.Where nPort is a port number and strAddr is a machine address or an Internet Protocol (IP) address.
Machine addresses can take several forms: "ftp.microsoft.com", "microsoft.com". IP addresses use the "dotted number" form "127.54.67.32". The
Connect
function checks to see if the address is a dotted number (although it does not check to ensure the number is a valid machine on the network). If not,Connect
assumes a machine name of one of the other forms.When you call
Accept
on the server side, you pass a reference to a new socket object. You must construct this object first, but do not callCreate
for it. Keep in mind that if this socket object goes out of scope, the connection closes. MFC connects the new object to a SOCKET handle. You can construct the socket on the stack, as shown, or on the heap.The archive and the socket file are closed when they go out of scope. The socket object's destructor also calls the Close member function for the socket object when the object goes out of scope or is deleted.
Additional Notes About the Sequence
The sequence of calls shown in the preceding table is for a stream socket. Datagram sockets, which are connectionless, do not require the CAsyncSocket::Connect, Listen, and Accept calls (although you can optionally use Connect
). Instead, if you are using class CAsyncSocket
, datagram sockets use the CAsyncSocket::SendTo
and ReceiveFrom
member functions. (If you use Connect
with a datagram socket, you use Send
and Receive
.) Because CArchive
does not work with datagrams, do not use CSocket
with an archive if the socket is a datagram.
CSocketFile does not support all of CFile
's functionality; CFile
members such as Seek
, which make no sense for a socket communication, are unavailable. Because of this, some default MFC Serialize
functions are not compatible with CSocketFile
. This is particularly true of the CEditView
class. You should not try to serialize CEditView
data through a CArchive
object attached to a CSocketFile
object using CEditView::SerializeRaw
; use CEditView::Serialize
instead (not documented). The SerializeRaw function expects the file object to have functions, such as Seek
, that CSocketFile
does not support.
For more information, see:
See also
Windows Sockets in MFC
CSocket Class
CAsyncSocket::Create
CAsyncSocket::Close