⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 transceiver.cpp

📁 ace开发环境 用来开发网络程序 其运用了设计模式、多平台、C++等多种知识
💻 CPP
字号:
// $Id: transceiver.cpp 72208 2006-04-20 11:30:35Z jwillemsen $// Test program for the event transceiver.  This program can play the// role of either Consumer or Supplier.  You can terminate this// program by typing ^C....#include "ace/OS_main.h"#include "ace/OS_NS_string.h"#include "ace/Service_Config.h"#include "ace/SOCK_Connector.h"#include "ace/Connector.h"#include "ace/Get_Opt.h"#include "ace/Signal.h"#include "ace/OS_NS_unistd.h"#include "transceiver.h"ACE_RCSID (Transceiver,           transceiver,           "$Id: transceiver.cpp 72208 2006-04-20 11:30:35Z jwillemsen $")// Handle the command-line arguments.intEvent_Transceiver::parse_args (int argc, ACE_TCHAR *argv[]){  ACE_Get_Opt get_opt (argc, argv, ACE_TEXT ("Ch:p:S"));  this->port_number_ = ACE_DEFAULT_SERVER_PORT;  this->host_name_ = ACE_DEFAULT_SERVER_HOST;  this->role_ = ACE_TEXT ("Supplier");  for (int c; (c = get_opt ()) != -1; )    switch (c)      {      case 'C':        this->role_ = ACE_TEXT ("Consumer");        break;      case 'h':        this->host_name_ = get_opt.opt_arg ();        break;      case 'p':        this->port_number_ = ACE_OS::atoi (get_opt.opt_arg ());        break;      case 'S':        this->role_ = ACE_TEXT ("Supplier");        break;      default:        ACE_ERROR_RETURN ((LM_ERROR,                           ACE_TEXT ("usage: %n [-CS] [-h host_name] [-p portnum] \n")),                          -1);        /* NOTREACHED */        break;      }  // Increment by 1 if we're the supplier to mirror the default  // behavior of the Event_Server (which sets the Consumer port to  // ACE_DEFAULT_SERVER_PORT and the Supplier port to  // ACE_DEFAULT_SERVER_PORT + 1).  Note that this is kind of a  // hack...  if (ACE_OS::strcmp (this->role_, ACE_TEXT ("Supplier")) == 0      && this->port_number_ == ACE_DEFAULT_SERVER_PORT)    this->port_number_++;  return 0;}intEvent_Transceiver::handle_close (ACE_HANDLE,                                 ACE_Reactor_Mask){  ACE_Reactor::instance ()->end_reactor_event_loop ();  return 0;}// Close down via SIGINT or SIGQUIT.intEvent_Transceiver::handle_signal (int,                                  siginfo_t *,                                  ucontext_t *){  ACE_Reactor::instance ()->end_reactor_event_loop ();  return 0;}Event_Transceiver::Event_Transceiver (void){}Event_Transceiver::Event_Transceiver (int argc, ACE_TCHAR *argv[]){  if (this->parse_args (argc, argv) == -1)    ACE_ERROR ((LM_ERROR,                ACE_TEXT ("%p\n"),                ACE_TEXT ("parse_args")));  else    {      ACE_Sig_Set sig_set;      sig_set.sig_add (SIGINT);      sig_set.sig_add (SIGQUIT);      // Register to handle the SIGINT and SIGQUIT signals.      if (ACE_Reactor::instance ()->register_handler          (sig_set,           this) == -1)        ACE_ERROR ((LM_ERROR,                    ACE_TEXT ("%p\n"),                    ACE_TEXT ("register_handler")));      // We need to register <this> here before we're connected since      // otherwise <get_handle> will return the connection socket      // handle for the peer.      else 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")));      // Address of the server.      ACE_INET_Addr server_addr (this->port_number_,                                 this->host_name_);      ACE_Connector<Event_Transceiver, ACE_SOCK_CONNECTOR> connector;      // We need a pointer here because connect takes a reference to a      // pointer!      Event_Transceiver *etp = this;      // Establish the connection to the Event Server.      if (connector.connect (etp,                             server_addr) == -1)        {          ACE_ERROR ((LM_ERROR,                      ACE_TEXT ("%p\n"),                      this->host_name_));          ACE_Reactor::instance()->remove_handler (sig_set);          ACE_Event_Handler::remove_stdin_handler (ACE_Reactor::instance(),                                                   ACE_Thread_Manager::instance());        }    }}intEvent_Transceiver::open (void *){  // Register ourselves to be notified when there's data to read on  // the socket.  if (ACE_Reactor::instance ()->register_handler      (this,       ACE_Event_Handler::READ_MASK) == -1)    ACE_ERROR_RETURN ((LM_ERROR,                       ACE_TEXT ("%p\n"),                       ACE_TEXT ("register_handler")),                       -1);  return 0;}intEvent_Transceiver::handle_input (ACE_HANDLE handle){  // Determine whether we play the role of a consumer or a supplier.  if (handle == ACE_STDIN)    return this->transmitter ();  else    return this->receiver ();}intEvent_Transceiver::transmitter (void){  ACE_DEBUG ((LM_DEBUG,              ACE_TEXT ("(%P|%t) entering %s transmitter\n"),              this->role_));  char buf[BUFSIZ];  ssize_t n = ACE_OS::read (ACE_STDIN, buf, sizeof buf);  int result = 0;  if (n <= 0 || this->peer ().send_n (buf, n) != n)    result = -1;  ACE_DEBUG ((LM_DEBUG,              ACE_TEXT ("(%P|%t) leaving %s transmitter\n"),              this->role_));  return result;}intEvent_Transceiver::receiver (void){  ACE_DEBUG ((LM_DEBUG,              ACE_TEXT ("(%P|%t) entering %s receiver\n"),              this->role_));  char buf[BUFSIZ];  ssize_t n = this->peer ().recv (buf, sizeof buf);  int result = 0;  if (n <= 0      || ACE_OS::write (ACE_STDOUT, buf, n) != n)    result = -1;  ACE_DEBUG ((LM_DEBUG,              ACE_TEXT ("(%P|%t) leaving %s receiver\n"),              this->role_));  return result;}intACE_TMAIN (int argc, ACE_TCHAR *argv[]){  if (ACE_Service_Config::open (argv[0]) == -1      && errno != ENOENT)    ACE_ERROR_RETURN ((LM_ERROR,                       ACE_TEXT ("%p\n"),                       ACE_TEXT ("open")),                       -1);  // Create and initialize the transceiver.  Event_Transceiver transceiver (argc, argv);  // Demonstrate how we can check if a constructor failed...  if (ACE_LOG_MSG->op_status () == -1)    ACE_ERROR_RETURN ((LM_ERROR,                       ACE_TEXT ("%p\n"),                       ACE_TEXT ("Event_Transceiver constructor failed")),                       -1);  // Run event loop until either the event server shuts down or we get  // a SIGINT.  ACE_Reactor::instance ()->run_reactor_event_loop ();  return 0;}

⌨️ 快捷键说明

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