ssl-server-fancy.cpp

来自「ACE自适配通信环境(ADAPTIVE Communication Enviro」· C++ 代码 · 共 614 行 · 第 1/2 页

CPP
614
字号
      ACE_INT32 len = 0;      if (parse_header_and_allocate_buffer (request,                                            &len) == -1)        return -1;      // Subtract off the sizeof the length prefix.      ssize_t r_bytes =        this->ssl_stream_ -> recv_n (request,                                     len - sizeof (ACE_UINT32));      if (r_bytes == -1)        {          ACE_ERROR ((LM_ERROR,                      ACE_TEXT ("%p\n"),                      ACE_TEXT ("recv")));          break;        }      else if (r_bytes == 0)        {          ACE_DEBUG ((LM_DEBUG,                      ACE_TEXT ("(%P|%t) reached end of input, connection ")                      ACE_TEXT ("closed by client\n")));          break;        }      else if (OPTIONS::instance ()->verbose ()               && ACE::write_n (ACE_STDOUT,                                request,                                r_bytes) != r_bytes)        ACE_ERROR ((LM_ERROR,                    ACE_TEXT ("%p\n"),                    ACE_TEXT ("ACE::write_n")));      else        {          ssize_t s_bytes =            (ssize_t) OPTIONS::instance ()->reply_message_len ();          // Don't try to send more than is in the request buffer!          if (s_bytes > r_bytes)            s_bytes = r_bytes;          if (this->ssl_stream_ -> send_n (request,                                           s_bytes) != s_bytes)            ACE_ERROR ((LM_ERROR,                        ACE_TEXT ("%p\n"),                        ACE_TEXT ("send_n")));        }      this->total_bytes_ += size_t (r_bytes);      this->message_count_++;      delete [] request;      request = 0;    }  delete [] request;  return 0;}Oneway_Handler::Oneway_Handler (ACE_SSL_SOCK_Stream *ssl_stream)  : Handler (ssl_stream){}voidOneway_Handler::print_results (void){  ACE_Profile_Timer::ACE_Elapsed_Time et;  this->timer_.elapsed_time (et);  ACE_DEBUG ((LM_DEBUG,              ACE_TEXT ("\t\treal time = %f secs \n\t\tuser time = %f secs \n\t\tsystem time = %f secs\n"),              et.real_time,              et.user_time,              et.system_time));  ACE_DEBUG ((LM_DEBUG,              ACE_TEXT ("\t\tmessages = %d\n\t\ttotal bytes = %d\n\t\tmbits/sec = %f\n\t\tusec-per-message = %f\n"),              this->message_count_,              this->total_bytes_,              (((double) this->total_bytes_ * 8) / et.real_time) / (double) (1024 * 1024),              ((et.user_time + et.system_time) / (double) this->message_count_) * ACE_ONE_SECOND_IN_USECS));}// Function entry point into the oneway server task.intOneway_Handler::run (void){  // Read data from client (terminate on error).  char *request = 0;  for (;;)    {      ACE_INT32 len = 0;      if (parse_header_and_allocate_buffer (request,                                            &len) == -1)        return -1;      // Subtract off the sizeof the length prefix.      ssize_t r_bytes =        this->ssl_stream_ -> recv_n (request,                                     len - sizeof (ACE_UINT32));      if (r_bytes == -1)        {          ACE_ERROR ((LM_ERROR,                      ACE_TEXT ("%p\n"),                      ACE_TEXT ("recv")));          break;        }      else if (r_bytes == 0)        {          ACE_DEBUG ((LM_DEBUG,                      ACE_TEXT ("(%P|%t) reached end of input, connection ")                      ACE_TEXT ("closed by client\n")));          break;        }      else if (OPTIONS::instance ()->verbose ()               && ACE::write_n (ACE_STDOUT,                                request,                                r_bytes) != r_bytes)        ACE_ERROR ((LM_ERROR,                    ACE_TEXT ("%p\n"),                    ACE_TEXT ("ACE::write_n")));      this->total_bytes_ += size_t (r_bytes);      this->message_count_++;      delete [] request;      request = 0;    }  delete [] request;  return 0;}// Create a twoway handler.Handler *Handler_Factory::make_twoway_handler (ACE_SSL_SOCK_Stream *ssl_stream){  return new Twoway_Handler (ssl_stream);}// Create a oneway handler.Handler *Handler_Factory::make_oneway_handler (ACE_SSL_SOCK_Stream *ssl_stream){  return new Oneway_Handler (ssl_stream);}intHandler_Factory::init_acceptors (void){  // Create the oneway and twoway server addresses.  ACE_INET_Addr twoway_server_addr (OPTIONS::instance ()->port ());  ACE_INET_Addr oneway_server_addr (OPTIONS::instance ()->port () + 1);  // Create acceptors, reuse the address.  if (this->twoway_acceptor_.open (twoway_server_addr, 1) == -1      || this->oneway_acceptor_.open (oneway_server_addr, 1) == -1)    ACE_ERROR_RETURN ((LM_ERROR,                       ACE_TEXT ("%p\n"),                       ACE_TEXT ("open")),                      -1);  else if (this->twoway_acceptor_.get_local_addr (twoway_server_addr) == -1           || this->oneway_acceptor_.get_local_addr (oneway_server_addr) == -1)    ACE_ERROR_RETURN ((LM_ERROR,                       ACE_TEXT ("%p\n"),                       ACE_TEXT ("get_local_addr")),                      -1);  ACE_DEBUG ((LM_DEBUG,              ACE_TEXT ("(%P|%t) starting twoway server at port %d and oneway server at port %d\n"),              twoway_server_addr.get_port_number (),              oneway_server_addr.get_port_number ()));  return 0;}intHandler_Factory::create_handler (  ACE_SSL_SOCK_Acceptor &acceptor,  Handler * (*handler_factory) (ACE_SSL_SOCK_Stream* ),  const char *handler_type){  ACE_SSL_SOCK_Stream* new_stream;  ACE_NEW_RETURN (new_stream, ACE_SSL_SOCK_Stream, -1);  if (acceptor.accept (*new_stream) == -1)    ACE_ERROR_RETURN ((LM_ERROR,                       ACE_TEXT ("%p\n"),                       ACE_TEXT ("accept")),                       -1);  Handler *handler;  ACE_ALLOCATOR_RETURN (handler,                        (*handler_factory) (new_stream),                        -1);  ACE_DEBUG ((LM_DEBUG,              ACE_TEXT ("(%P|%t) spawning %s handler\n"),              handler_type));  if (handler->open () == -1)    return -1;#if defined (ACE_MT_SAFE)  // Spawn a new thread and run the new connection in that thread of  // control using the <server> function as the entry point.  return handler->activate ();#else  handler->svc ();  handler->close (0);  return 0;#endif /* ACE_HAS_THREADS */}Handler_Factory::Handler_Factory (void){}Handler_Factory::~Handler_Factory (void){  this->twoway_acceptor_.close ();  this->oneway_acceptor_.close ();}// Run the main event loop.intHandler_Factory::handle_events (void){  if (this->init_acceptors () == -1)    return -1;  fd_set handles;  FD_ZERO (&handles);  FD_SET ((ACE_SOCKET) this->twoway_acceptor_.get_handle (), &handles);  FD_SET ((ACE_SOCKET) this->oneway_acceptor_.get_handle (), &handles);  // Performs the iterative server activities.  for (;;)    {      ACE_Time_Value timeout (ACE_DEFAULT_TIMEOUT);      fd_set temp = handles;      int result =        ACE_OS::select (int (this->oneway_acceptor_.get_handle ()) + 1,                        (fd_set *) &temp,                        0,                        0,                        timeout);      if (result == -1)        ACE_ERROR ((LM_ERROR,                    ACE_TEXT ("(%P|%t) %p\n"),                    ACE_TEXT ("select")));      else if (result == 0 && OPTIONS::instance ()->verbose ())        ACE_DEBUG ((LM_DEBUG,                    ACE_TEXT ("(%P|%t) select timed out\n")));      else        {          if (FD_ISSET (this->twoway_acceptor_.get_handle (),                        &temp))            this->create_handler (this->twoway_acceptor_,                                  &Handler_Factory::make_twoway_handler,                                  "twoway");          if (FD_ISSET (this->oneway_acceptor_.get_handle (),                        &temp))            this->create_handler (this->oneway_acceptor_,                                  &Handler_Factory::make_oneway_handler,                                  "oneway");        }    }  ACE_NOTREACHED (return 0;)}intACE_TMAIN (int argc, ACE_TCHAR *argv[]){  ACE_SSL_Context *context = ACE_SSL_Context::instance ();  context->certificate ("./dummy.pem", SSL_FILETYPE_PEM);  context->private_key ("./key.pem", SSL_FILETYPE_PEM);  OPTIONS::instance ()->parse_args (argc, argv);  Handler_Factory server;  return server.handle_events ();}#if defined (ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION)template class ACE_Singleton<Options, ACE_SYNCH_RECURSIVE_MUTEX>;template class ACE_Svc_Handler<ACE_SSL_SOCK_STREAM, ACE_NULL_SYNCH>;#elif defined (ACE_HAS_TEMPLATE_INSTANTIATION_PRAGMA)#pragma instantiate ACE_Singleton<Options, ACE_SYNCH_RECURSIVE_MUTEX>#pragma instantiate ACE_Svc_Handler<ACE_SSL_SOCK_STREAM, ACE_NULL_SYNCH>#endif /* ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION */

⌨️ 快捷键说明

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