UDP Client/Server example application

This Application is a command line based client/server application, which sends some strings from client to server, where they are printed on the command line.

After installing the Library, the udpServer and the udpClient can be found in the senf/Example/udpServer directory and compiled with

scons -u

 
Now you can start the application with

./udpServer

./udpClient

UDP server application

We take a look to the code starting with the Server: The file starts out including the necessary
header files:

\skip // Custom includes
\until membind

The Scheduler will be needed because we implement a non blocking UDP Server with the %senf
integrated Scheduler. The  scheduler library provides a simple yet flexible abstraction of
the standard asynchronous UNIX mainloop utilizing \c select or \c poll.

First we define a class which is responsible for opening a socket and print out the incoming
data on stdout. We create a \c ::UDPv4ClientSocketHandle, which is an unconnected and
uninitialized UDP (IPv4) socket.

\until serverSock;

The name \e client socket handle is a bit misleading: The handle is a \e client and not a \e
server socket handle since it implements the ordinary (client) socket API and not the connection
oriented (e.g. TCP accept) server socket API. Since UDP is not connection oriented, there exists
no \c UDPv4ServerSocketHandle.

\until {}

The constructor initialize the Server Object with a given address and port. In our case the
server configuration is static: The server listens on the loopback device on port 4243. We
instantiate and configure a senf::scheduler::FdEvent instance to call Server::readFromClient
whenever data is available on the handle.

\until }

The public \c run() member is called to run the sniffer. It enables the event callback and
enters the scheduler main-loop.

\until event)

This member function is called by the %scheduler whenever new data is available. The scheduler
passes in an event-mask of the event(s) triggering the call.

\until };

In the function the data from the socket is put into a standard string and dumped out on stdout.

\until return 0;
\until }

In the main function we need to create an Object of our Server with the loopback address and the
port.

That's it. We finish of by catching the exception and giving as much %detail as possible if an
exception is caught. The \c prettyName function from the \c Utils library is used, to get a
nice, printable representation of the dynamic type of the exception instance. It is an interface
to the g++ de-mangler. This is necessary since the name member of the C++ \c type_info instance
is a mangled name in g++.

UDP client application

\dontinclude udpClient.cc

The client application uses the same mechanisms but implements them in a small main function.
It sends numbers as strings to the server.

\skip  argv[])
\until return 0;
\until }

First a \c senf::::UDPv4ClientSocketHandle is created. With
<tt>writeto(senf::INet4SocketAddress, string)</tt> the string \c s will be written to the
specified address and port, which is constructed here from a static string read from the command
line with the syntax \c IP:PORT. In this example Integers from zero to ten are send to the
Server socket.