spipe-acceptor.cpp

来自「ace开发环境 用来开发网络程序 其运用了设计模式、多平台、C++等多种知识」· C++ 代码 · 共 225 行

CPP
225
字号
// $Id: SPIPE-acceptor.cpp 78398 2007-05-18 02:28:30Z sowayaa $#if !defined (SPIPE_ACCEPTOR_C)#define SPIPE_ACCEPTOR_C#include "ace/OS_NS_string.h"#include "ace/SPIPE_Addr.h"#include "ace/SPIPE_Acceptor.h"#include "ace/Proactor.h"#include "ace/Get_Opt.h"#include "ace/Signal.h"#include "SPIPE-acceptor.h"ACE_RCSID(blocking, SPIPE_acceptor, "$Id: SPIPE-acceptor.cpp 78398 2007-05-18 02:28:30Z sowayaa $")#if defined (ACE_HAS_WIN32_OVERLAPPED_IO) || defined (ACE_HAS_AIO_CALLS)Svc_Handler::Svc_Handler (void)  : mb_ (BUFSIZ + 1){  // An extra byte for null termination.  this->mb_.size (BUFSIZ);}Svc_Handler::~Svc_Handler (void){}intSvc_Handler::open (void *){  ACE_DEBUG ((LM_DEBUG,              ACE_TEXT ("client connected on handle %d\n"),              this->peer ().get_handle ()));  if (this->ar_.open (*this,                      this->peer ().get_handle ()) == -1)    return -1;  return this->ar_.read (this->mb_,                         this->mb_.size ());}voidSvc_Handler::handle_read_stream (const ACE_Asynch_Read_Stream::Result &result){  if (result.success () && result.bytes_transferred () > 0)    {      result.message_block ().rd_ptr ()[result.message_block ().length ()] = '\0';      // Print out the message received from the server.      ACE_DEBUG ((LM_DEBUG,                  ACE_TEXT ("(%t) message size %d.\n"),                  result.message_block ().length ()));      ACE_DEBUG ((LM_DEBUG,                  ACE_TEXT ("%C"),                  result.message_block ().rd_ptr ()));      // Reset the message block here to make sure multiple writes to      // the pipe don't keep appending to the message_block!      this->mb_.reset ();      this->ar_.read (this->mb_, this->mb_.size ());    }  else    ACE_Proactor::end_event_loop ();}IPC_Server::IPC_Server (void)  : n_threads_ (1),    shutdown_ (0){  ACE_OS::strcpy (rendezvous_, ACE_TEXT ("acepipe"));}IPC_Server::~IPC_Server (void){}intIPC_Server::handle_signal (int,                           siginfo_t *,                           ucontext_t *){  ACE_LOG_MSG->log (LM_INFO, ACE_TEXT ("IPC_Server::handle_signal().\n"));  // Flag the main <svc> loop to shutdown.  this->shutdown_ = 1;  this->acceptor ().close (); // Close underlying acceptor.  // This should cause the <accept> to fail, which will "bounce"  // us out of the loop in <svc>.  return 0;}intIPC_Server::init (int argc, ACE_TCHAR *argv[]){  if (this->parse_args (argc, argv) == -1)    return -1;  ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("Opening %s\n"), rendezvous_));  // Initialize named pipe listener.  if (this->open (ACE_SPIPE_Addr (rendezvous_)) == -1)    ACE_ERROR_RETURN ((LM_ERROR,                       ACE_TEXT ("%p\n"),                       ACE_TEXT ("open")), 1);  // Register to receive shutdowns using this handler.  else if (ACE_Reactor::instance ()->register_handler      (SIGINT, this) == -1)    return -1;  else    return 0;}intIPC_Server::fini (void){  return 0;}intIPC_Server::parse_args (int argc, ACE_TCHAR *argv[]){  ACE_LOG_MSG->open (argv[0]);  ACE_Get_Opt get_opt (argc, argv, ACE_TEXT ("ut:r:"));  for (int c; (c = get_opt ()) != -1; )    {      switch (c)        {        case 'r':          ACE_OS::strncpy (rendezvous_,                           get_opt.opt_arg (),                           sizeof (rendezvous_) / sizeof (ACE_TCHAR));          break;        case 't':          n_threads_ = ACE_OS::atoi (get_opt.opt_arg ());                                     ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("%s == %d.\n"),                                     get_opt.opt_arg (),                                     n_threads_));          ACE_Proactor::instance (2 * n_threads_);          // This is a lame way to tell the proactor how many threads          // we'll be using.          break;        case 'u':        default:          ACE_ERROR_RETURN ((LM_ERROR,                            ACE_TEXT ("usage: %n -t <threads>\n")                            ACE_TEXT (" -r <rendezvous>\n")), -1);        }    }  return 0;}static ACE_THR_FUNC_RETURNrun_reactor_event_loop (void *){  ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("(%t) worker thread starting\n")));  ACE_Proactor::run_event_loop ();  return 0;}intIPC_Server::svc (void){  // Performs the iterative server activities.  while (this->shutdown_ == 0)    {      Svc_Handler sh;      // Create a new SH endpoint, which performs all processing in      // its open() method (note no automatic restart if errno ==      // EINTR).      if (this->accept (&sh, 0) == -1)        ACE_ERROR_RETURN ((LM_ERROR,                           ACE_TEXT ("%p\n"),                           ACE_TEXT ("accept")),                          1);      // SH's destructor closes the stream implicitly but the      // listening endpoint stays open.      else        {          // Run single-threaded.          if (n_threads_ <= 1)            run_reactor_event_loop (0);          else            {              if (ACE_Thread_Manager::instance ()->spawn_n                   (n_threads_,                    run_reactor_event_loop,                    0,                    THR_NEW_LWP) == -1)                ACE_ERROR_RETURN ((LM_ERROR,                                   ACE_TEXT ("%p\n"),                                   ACE_TEXT ("spawn_n")),                                  1);              ACE_Thread_Manager::instance ()->wait ();            }          ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("(%t) main thread exiting.\n")));          // Reset the Proactor so another accept will work.          ACE_Proactor::reset_event_loop();          // Must use some other method now to terminate this thing          // instead of the ACE_Signal_Adapter just running          // ACE_Proactor::end_event_loop()...  Since this is an          // ACE_Event_Handler, doesn't it seem possible to implement          // a handle_signal() hook, and catch the signal there?        }    }  /* NOTREACHED */  return 0;}#endif /* ACE_HAS_WIN32_OVERLAPPED_IO || ACE_HAS_AIO_CALLS */#endif /* SPIPE_ACCEPTOR_C */

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?