1. Initialize Windows Sockets
The following initialization code should be in the main
CWinApp derived object's overridable
InitInstance function.
if (!AfxSocketInit())
{
AfxMessageBox(IDP_SOCKETS_INIT_FAILED);
return FALSE;
}
Initializing Windows Sockets is critical. Failing to initialize
Windows Sockets will cause all other socket function calls to
fail.
2. Create a local socket
The call to create a socket looks like this:
m_MySocket.Create();
In this sample, a socket is represented by the
CAsyncSocket derived class CMySocket. An
object of CMySocket type is declared as a private
member variable of the main dialog class and named
m_MySocket.
m_MySocket is unusable until its
Create member function is called, which is done
in the main dialog's OnInitDialog overridable
function. Since this sample demonstrates using a TCP socket
connection (socket type SOCK_STREAM) and is a client
application which does not require specifying a particular
well-known port, the default parameters of the
Create function are used.
3. Establish a connection
Connections are established by calling the socket object's
Connect member function.
m_MySocket.Connect(AddressToConnectTo,
PortToConnectTo);
Where AddressToConnectTo is a string that
represents the IP address of the device server in dotted number
format (e.g. "10.0.0.1").
And PortToConnectTo is the port number used
by the device server for raw TCP connections to port number one. On
Digi device servers this port number defaults to
2101.
Because non-blocking sockets are being used, the call to
Connect should return immediately, and the
socket will receive an OnConnect notification
when the operation is complete.
4. Transmit data
Transmitting data is done by calling the socket's
Send member functions.
m_MySocket.Send(Data, Length);
After receiving the OnConnect notification
and verifying the connection completed successfully, the sample
uses the socket to transmit some data.
The sample is not concerned about sending out-of-band data or
routing of the TCP packet, so the only parameters needed for the
Send function are: Data
which is a pointer to a buffer containing the data to transmit, and
Length which is the number of bytes of data in
the buffer.
5. Receive data
To retrieve data, the socket's Receive
member function is called. In the function call the sample provides
a buffer (Data) to store the incoming data, and
the length (sizeof(Data)) of that buffer in
bytes.
m_MySocket.Receive(Data, sizeof(Data));
With the device server setup with the loopback plug, the data
transmitted in the step above will be sent directly back to the
sample application. The socket is notified that data has arrived
for it when it receives the OnReceive
notification.
6. Close the socket
Accomplish this task by calling the following two functions:
m_MySocket.ShutDown(CAsyncSocket::both);
m_MySocket.Close();
When the sample application is done using the socket, the
connection it represents must be terminated properly
(ShutDown) and any resources it may be using
should be released (Close).