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(7777, SOCK_DGRAM)
In this sample, the 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 UDP socket that
sends and receives data, a well-known port
(7777
) and datagram socket type
(SOCK_DGRAM
) are both supplied to the call to
Create
. The remaining default parameters of the
Create
function are sufficient for the application's
purposes.
3. Transmit data
Transmitting data is done by calling the socket's
SendTo
member functions.
m_MySocket.SendTo(Data, Length,
PortToSendTo, AddressToSendTo);
The SendTo
member function is used on
connectionless UDP sockets to transmit a datagram to a specific
peer. The parameters supplied are: Data
which
is a pointer to a buffer containing the data to transmit,
Length
which is the number of bytes of data in
the buffer, and PortToSendTo
and
AddressToSendTo
which are the port number and
IP address of the device server that should receive the data. For
Digi device servers, the UDP port number for Port 1 is
2101
4. Receive data
To retrieve data, the socket's ReceiveFrom
member function is called.
m_MySocket.ReceiveFrom(Data, sizeof(Data),
AddressReceivedFrom,
PortReceivedFrom);
In the function call the sample provides a buffer
(Data
) to store the incoming data, the length
(sizeof(Data)
) of that buffer in bytes, and
locations (AddressReceivedFrom
and
PortReceivedFrom
) to store the IP address and
port number of the device server that sent the 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.
5. 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
).