event_server.cpp
来自「ace开发环境 用来开发网络程序 其运用了设计模式、多平台、C++等多种知识」· C++ 代码 · 共 259 行
CPP
259 行
// $Id: event_server.cpp 73555 2006-07-17 06:28:31Z ossama $// Main driver program for the event server example.#include "ace/OS_main.h"#include "ace/Service_Config.h"#include "ace/OS_NS_unistd.h"#include "Options.h"#include "Consumer_Router.h"#include "Event_Analyzer.h"#include "Supplier_Router.h"#include "ace/Sig_Adapter.h"#include "ace/Stream.h"ACE_RCSID (Event_Server, event_server, "$Id: event_server.cpp 73555 2006-07-17 06:28:31Z ossama $")// Typedef these components to handle multi-threading correctly.typedef ACE_Stream<ACE_SYNCH> MT_Stream;typedef ACE_Module<ACE_SYNCH> MT_Module;class Event_Server : public ACE_Sig_Adapter{ // = TITLE // Run the logic for the <Event_Server>. // // = DESCRIPTION // In addition to packaging the <Event_Server> components, this // class also handles SIGINT and terminate the entire // application process. There are several ways to terminate // this application process: // // 1. Send a SIGINT signal (e.g., via ^C) // 2. Type any character on the STDIN. // // Note that by inheriting from the <ACE_Sig_Adapter> we can // shutdown the <ACE_Reactor> cleanly when a SIGINT is // generated.public: Event_Server (void); // Constructor. int svc (void); // Run the event-loop for the event server.private: virtual int handle_input (ACE_HANDLE handle); // Hook method called back when a user types something into the // STDIN in order to shut down the program. int configure_stream (void); // Setup the plumbing in the stream. int set_watermarks (void); // Set the high and low queue watermarks. int run_event_loop (void); // Run the event-loop for the <Event_Server>. MT_Stream event_server_; // The <ACE_Stream> that contains the <Event_Server> application // <Modules>.};Event_Server::Event_Server (void) : ACE_Sig_Adapter (ACE_Sig_Handler_Ex (ACE_Reactor::end_event_loop)) // Shutdown the <ACE_Reactor>'s event loop when a SIGINT is // received.{ // Register to trap STDIN from the user. if (ACE_Event_Handler::register_stdin_handler (this, ACE_Reactor::instance (), ACE_Thread_Manager::instance ()) == -1) ACE_ERROR ((LM_ERROR, ACE_TEXT ("%p\n"), ACE_TEXT ("register_stdin_handler"))); // Register to trap the SIGINT signal. else if (ACE_Reactor::instance ()->register_handler (SIGINT, this) == -1) ACE_ERROR ((LM_ERROR, ACE_TEXT ("%p\n"), ACE_TEXT ("register_handler")));}intEvent_Server::handle_input (ACE_HANDLE){ // This code here will make sure we actually wait for the user to // type something. On platforms like Win32, <handle_input> is called // prematurely (even when there is no data). char temp_buffer [BUFSIZ]; ssize_t n = ACE_OS::read (ACE_STDIN, temp_buffer, sizeof (temp_buffer)); // This ought to be > 0, otherwise something very strange has // happened!! ACE_ASSERT (n > 0); ACE_UNUSED_ARG (n); // To avoid compile warning with ACE_NDEBUG. Options::instance ()->stop_timer (); ACE_DEBUG ((LM_INFO, ACE_TEXT ("(%t) closing down the test\n"))); Options::instance ()->print_results (); ACE_Reactor::instance ()->end_reactor_event_loop (); return -1;}intEvent_Server::configure_stream (void){ Peer_Router_Context *src; // Create the <Supplier_Router>'s routing context. This contains a // context shared by both the write-side and read-side of the // <Supplier_Router> Module. ACE_NEW_RETURN (src, Peer_Router_Context (Options::instance ()->supplier_port ()), -1); MT_Module *srm = 0; // Create the <Supplier_Router> module. ACE_NEW_RETURN (srm, MT_Module (ACE_TEXT ("Supplier_Router"), new Supplier_Router (src), new Supplier_Router (src)), -1); MT_Module *eam = 0; // Create the <Event_Analyzer> module. ACE_NEW_RETURN (eam, MT_Module (ACE_TEXT ("Event_Analyzer"), new Event_Analyzer, new Event_Analyzer), -1); Peer_Router_Context *crc; // Create the <Consumer_Router>'s routing context. This contains a // context shared by both the write-side and read-side of the // <Consumer_Router> Module. ACE_NEW_RETURN (crc, Peer_Router_Context (Options::instance ()->consumer_port ()), -1); MT_Module *crm = 0; // Create the <Consumer_Router> module. ACE_NEW_RETURN (crm, MT_Module (ACE_TEXT ("Consumer_Router"), new Consumer_Router (crc), new Consumer_Router (crc)), -1); // Push the Modules onto the event_server stream. if (this->event_server_.push (srm) == -1) ACE_ERROR_RETURN ((LM_ERROR, ACE_TEXT ("%p\n"), ACE_TEXT ("push (Supplier_Router)")), -1); else if (this->event_server_.push (eam) == -1) ACE_ERROR_RETURN ((LM_ERROR, ACE_TEXT ("%p\n"), ACE_TEXT ("push (Event_Analyzer)")), -1); else if (this->event_server_.push (crm) == -1) ACE_ERROR_RETURN ((LM_ERROR, ACE_TEXT ("%p\n"), ACE_TEXT ("push (Consumer_Router)")), -1); return 0;}intEvent_Server::set_watermarks (void){ // Set the high and low water marks appropriately. The water marks // control how much data can be buffered before the queues are // considered "full." size_t wm = Options::instance ()->low_water_mark (); if (this->event_server_.control (ACE_IO_Cntl_Msg::SET_LWM, &wm) == -1) ACE_ERROR_RETURN ((LM_ERROR, ACE_TEXT ("%p\n"), ACE_TEXT ("push (setting low watermark)")), -1); wm = Options::instance ()->high_water_mark (); if (this->event_server_.control (ACE_IO_Cntl_Msg::SET_HWM, &wm) == -1) ACE_ERROR_RETURN ((LM_ERROR, ACE_TEXT ("%p\n"), ACE_TEXT ("push (setting high watermark)")), -1); return 0;}intEvent_Server::run_event_loop (void){ // Begin the timer. Options::instance ()->start_timer (); // Perform the main event loop waiting for the user to type ^C or to // enter a line on the ACE_STDIN. ACE_Reactor::instance ()->run_reactor_event_loop (); // Close down the stream and call the <close> hooks on all the // <ACE_Task>s in the various Modules in the Stream. this->event_server_.close (); // Wait for the threads in the <Consumer_Router> and // <Supplier_Router> to exit. return ACE_Thread_Manager::instance ()->wait ();}intEvent_Server::svc (void){ if (this->configure_stream () == -1) return -1; else if (this->set_watermarks () == -1) return -1; else if (this->run_event_loop () == -1) return -1; else return 0;}intACE_TMAIN (int argc, ACE_TCHAR *argv[]){#if defined (ACE_HAS_THREADS) Options::instance ()->parse_args (argc, argv); // Initialize the <Event_Server>. Event_Server event_server; // Run the event server's event-loop. int result = event_server.svc (); ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("exiting main\n"))); return result;#else ACE_UNUSED_ARG (argc); ACE_UNUSED_ARG (argv); ACE_ERROR_RETURN ((LM_ERROR, ACE_TEXT ("threads not supported on this platform\n")), 1);#endif /* ACE_HAS_THREADS */}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?