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