diff options
Diffstat (limited to 'trunk/ACE/examples/QOS/Diffserv/server.cpp')
-rw-r--r-- | trunk/ACE/examples/QOS/Diffserv/server.cpp | 163 |
1 files changed, 163 insertions, 0 deletions
diff --git a/trunk/ACE/examples/QOS/Diffserv/server.cpp b/trunk/ACE/examples/QOS/Diffserv/server.cpp new file mode 100644 index 00000000000..a1030d775e9 --- /dev/null +++ b/trunk/ACE/examples/QOS/Diffserv/server.cpp @@ -0,0 +1,163 @@ +//============================================================================= +/** + * @file server.cpp + * + * $Id$ + * + * @author Craig Rodrigues <crodrigu@bbn.com> + * @brief Start a server which listens for UDP packets on a specified port. + */ +//============================================================================= + +#include "ace/Reactor.h" +#include "ace/Process.h" +#include "ace/SOCK_Dgram.h" +#include "ace/INET_Addr.h" +#include "ace/Log_Msg.h" + +// Port used to receive for dgrams. +static u_short port1; + +class Dgram_Endpoint : public ACE_Event_Handler +{ +public: + Dgram_Endpoint (const ACE_INET_Addr &local_addr); + + // = Hook methods inherited from the <ACE_Event_Handler>. + virtual ACE_HANDLE get_handle (void) const; + virtual int handle_input (ACE_HANDLE handle); + virtual int handle_timeout (const ACE_Time_Value & tv, + const void *arg = 0); + virtual int handle_close (ACE_HANDLE handle, + ACE_Reactor_Mask close_mask); + + int send (const char *buf, size_t len, const ACE_INET_Addr &); + // Send the <buf> to the peer. + +private: + ACE_SOCK_Dgram endpoint_; + // Wrapper for sending/receiving dgrams. +}; + +int +Dgram_Endpoint::send (const char *buf, + size_t len, + const ACE_INET_Addr &addr) +{ + return this->endpoint_.send (buf, len, addr); +} + +Dgram_Endpoint::Dgram_Endpoint (const ACE_INET_Addr &local_addr) + : endpoint_ (local_addr) +{ +} + +ACE_HANDLE +Dgram_Endpoint::get_handle (void) const +{ + return this->endpoint_.get_handle (); +} + +int +Dgram_Endpoint::handle_close (ACE_HANDLE handle, + ACE_Reactor_Mask) +{ + ACE_UNUSED_ARG (handle); + + this->endpoint_.close (); + delete this; + return 0; +} + +int +Dgram_Endpoint::handle_input (ACE_HANDLE) +{ + char buf[BUFSIZ]; + ACE_INET_Addr from_addr; + + ssize_t n = this->endpoint_.recv (buf, + sizeof buf, + from_addr); + + if (n == -1) + ACE_ERROR ((LM_ERROR, + "%p\n", + "handle_input")); + else + { + buf[n] = 0; + ACE_DEBUG ((LM_DEBUG, + "Received buf of size %d = %s\n", + n, + buf)); + } + return 0; +} + +int +Dgram_Endpoint::handle_timeout (const ACE_Time_Value &, + const void *) +{ + ACE_DEBUG ((LM_DEBUG, + "(%P|%t) timed out for endpoint\n")); + return 0; +} + +static int +run_test (u_short localport) +{ + ACE_INET_Addr local_addr (localport); + + Dgram_Endpoint *endpoint; + + ACE_NEW_RETURN (endpoint, + Dgram_Endpoint (local_addr), + -1); + + ACE_DEBUG((LM_DEBUG, "Starting server on port %d\n",port1)); + + // Read data from other side. + if (ACE_Reactor::instance ()->register_handler + (endpoint, + ACE_Event_Handler::READ_MASK) == -1) + ACE_ERROR_RETURN ((LM_ERROR, + "ACE_Reactor::register_handler"), + -1); + + int ret; + while(1){ + ACE_Time_Value tv(10, 0); + ret = ACE_Reactor::instance ()->handle_events (&tv); + /* Error occurred while handling event */ + if (ret < 0) + { + ACE_ERROR_RETURN ((LM_DEBUG, + "(%P|%t) %p\n", + "handle_events"), + -1); + } + /* We have timed out without handling an event, break out of loop */ + if(ret == 0) break; + } + + return 0; +} + +int +ACE_TMAIN (int argc, ACE_TCHAR *argv[]) +{ + // Estabish call backs and socket names. + + port1 = argc > 1 ? ACE_OS::atoi (argv[1]) : ACE_DEFAULT_SERVER_PORT; + + if(argc < 3) + { + run_test (port1); + } + else{ + ACE_DEBUG((LM_DEBUG, "\nUsage:\n %s [port number]\n", argv[0])); + return -1; + } + + return 0; +} |