1. Create a local socket
The call to create a socket looks like this:
int Socket = socket(AF_INET, Type, Protocol);
Where Type
is SOCK_DGRAM
and
Protocol
is IPPROTO_UDP
for a
blocking, connectionless datagram socket.
2. Bind to a local port
To bind the socket to a local port, call the following
function:
bind(Socket, &SockAddr, sizeof(SockAddr));
Binding to a local port must be done before using the socket to
calls like sendto
, and is used to associate the
currently unnamed socket with a local name.
The SockAddr
parameter is the struct
sockaddr
representation of the local name to bind to. This
name consists of an address family (for UDP, always
AF_INET
), a host address, and a port number.
In this sample, the calls to socket
and
bind
are both done in the function
MySocketOpen
. Since this sample demonstrates a
UDP application, a well-known port (7777
) is
supplied to the call to MySocketOpen
. The same
well-known port is also used by the device server as part of its
UDP Client destination address information.
3. Transmit data
Transmitting data is done by calling
sendto
.
sendto(Socket, Data, Length, 0,
&SockAddr, sizeof(SockAddr));
To simplify transmitting data this sample uses its own function
named MySocketSendTo
.
MySocketSendTo(MySocket, SendData, sizeof(SendData),
AddressToSendTo, PortToSendTo);
The parameters needed for MySocketSend
are:
MySocket
which is the socket returned from
MySocketOpen
, SendData
which is a
pointer to the buffer holding the data to send,
sizeof(SendData)
which is the number of bytes
SendData
points to, and
AddressToSendTo
and
PortToSendTo
which provide the IP address and
port number of the device server to send the data to. For Digi
device servers, the UDP port number for Port 1 is
2101
4. Receive data
To retrieve data received at the local address, call
recvfrom
.
recvfrom(Socket, Data, Length, 0,
&SockAddr, &SockAddrLength);
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.
Like sendto
, the sample provides an alternative
function, MySocketRecvFrom
that is somewhat
easier to use.
MySocketRecvFrom(MySocket, RecvData, sizeof(RecvData),
AddressReceivedFrom,
&AddressReceivedFromLength)
The caller to MySocketRecv
need only supply the
prerequisite MySocket
, a buffer
RecvData
to hold the received data,
sizeof(RecvData)
which specifies the length of
RecvData
, AddressReceivedFrom
which provides space to return a string representation of the IP
address and port number of the device server that sent the data,
and &AddressReceivedFromLength
which
specifies the length of AddressReceivedFrom
.
5. Close the socket
Accomplish this task by calling the following two functions:
shutdown(Socket, SHUT_RDWR);
close(Socket);
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
).