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

📄 server.cpp

📁 ace开发环境 用来开发网络程序 其运用了设计模式、多平台、C++等多种知识
💻 CPP
字号:
/** * server for a reactor based connection establishment test using HTBP * * $Id: server.cpp 79534 2007-08-30 00:15:46Z shuston $ */#include "ace/Log_Msg.h"#include "ace/HTBP/HTBP_Session.h"#include "ace/HTBP/HTBP_Stream.h"#include "ace/HTBP/HTBP_Addr.h"#include "ace/SOCK_Acceptor.h"#include "ace/SOCK_Stream.h"#include "ace/Event_Handler.h"#include "ace/Reactor.h"#include "ace/Get_Opt.h"#include "ace/OS_NS_stdio.h"#include "ace/OS_NS_unistd.h"unsigned port = 8088;const ACE_TCHAR *notifier_file = 0;intparse_args (int argc, ACE_TCHAR *argv[]){  ACE_Get_Opt get_opts (argc, argv, ACE_TEXT("o:p:"));  int c;  while ((c = get_opts ()) != -1)    switch (c)      {      case 'o':        notifier_file = get_opts.opt_arg();        break;      case 'p':        port = static_cast<unsigned>(ACE_OS::atoi (get_opts.opt_arg()));        break;      case '?':      default:        ACE_ERROR_RETURN ((LM_ERROR,                           "usage:  %s "                           "-p port "                            "\n",                           argv [0]),                          -1);      }  // Indicates sucessful parsing of the command line  return 0;}class Accept_Handler : public ACE_Event_Handler{public:  Accept_Handler (ACE_SOCK_Acceptor& a);  virtual ~Accept_Handler (void);  virtual int handle_input (ACE_HANDLE );private:  ACE_SOCK_Acceptor& acceptor_;  ACE::HTBP::Channel *channels_[2];};class Stream_Handler : public ACE_Event_Handler{public:  Stream_Handler (ACE::HTBP::Stream &s);  virtual ~Stream_Handler ();  virtual int handle_input (ACE_HANDLE );private:  ACE::HTBP::Stream &stream_;};Accept_Handler::Accept_Handler(ACE_SOCK_Acceptor &a)  :ACE_Event_Handler(),   acceptor_(a){  this->channels_[0] = this->channels_[1] = 0;  if (this->reactor() == 0)    this->reactor(ACE_Reactor::instance());  this->reactor()->register_handler (acceptor_.get_handle(),                                     this,                                     ACE_Event_Handler::ACCEPT_MASK);}Accept_Handler::~Accept_Handler(){  this->reactor()->remove_handler (acceptor_.get_handle(),                                   ACE_Event_Handler::ACCEPT_MASK|                                   ACE_Event_Handler::DONT_CALL);  acceptor_.close();}intAccept_Handler::handle_input (ACE_HANDLE h){  ACE::HTBP::Channel **ch = 0;  if (h == acceptor_.get_handle())    {      ACE_SOCK_Stream *sock = new ACE_SOCK_Stream;      acceptor_.accept(*sock);      ch = channels_[0] == 0 ? &channels_[0] :& channels_[1];      *ch = new ACE::HTBP::Channel(*sock);      this->reactor()->register_handler (sock->get_handle(),                                         this,                                         ACE_Event_Handler::READ_MASK);      return 0;    }  for (int i = 0; i < 2; i++)    if (channels_[i] && channels_[i]->get_handle() == h)      {        ch = &channels_[i];        break;      }  if (ch == 0)    ACE_ERROR_RETURN ((LM_ERROR,                       ACE_TEXT ("(%P|%t) Server Accept_Handler::handle_input, ")                       ACE_TEXT ("unknown handle %d\n") ,h),                      -1);  int result = (*ch)->pre_recv();  if (result == 0)    {      this->reactor()->remove_handler (h,                                      ACE_Event_Handler::READ_MASK |                                      ACE_Event_Handler::DONT_CALL);      (*ch)->register_notifier(this->reactor());      ACE::HTBP::Session *session = (*ch)->session();      ACE::HTBP::Stream *stream = new ACE::HTBP::Stream(session);      ACE_Event_Handler *handler = session->handler();      if (handler == 0)        {          ACE_DEBUG ((LM_DEBUG,                      ACE_TEXT ("(%P|%t) Server Accept_Handler::handle_input ")                      ACE_TEXT ("Creating new stream handler for %d\n"),                      stream->get_handle()));          Stream_Handler *sh = new Stream_Handler(*stream);          session->handler (sh);        }      else        ACE_DEBUG ((LM_DEBUG,                    ACE_TEXT ("(%P|%t) Server Accept_Handler::handle_input ")                    ACE_TEXT ("There is already a handler for %d\n"),                    stream->get_handle()));      if ((*ch)->state() == ACE::HTBP::Channel::Data_Queued)        {          ACE_DEBUG ((LM_DEBUG,                      ACE_TEXT ("(%P|%t) Server Accept_Handler::handle_input \n"),                      ACE_TEXT ("Issuing notification on handler\n")));          this->reactor()->notify (session->handler(),                                   ACE_Event_Handler::READ_MASK);        }      *ch = 0;    }  return 0;}Stream_Handler::Stream_Handler (ACE::HTBP::Stream &s)  :stream_(s){}Stream_Handler::~Stream_Handler (){}intStream_Handler::handle_input (ACE_HANDLE h){  char buffer[1000];  ssize_t n = this->stream_.recv (buffer,1000);  if (n == -1)    ACE_ERROR_RETURN ((LM_ERROR,                       ACE_TEXT ("(%P|%t) Server Stream_Handler::handle_input %p\n"),                       ACE_TEXT ("recv")),                      0);  buffer[n] = 0;  ACE_DEBUG ((LM_DEBUG,              ACE_TEXT ("(%P|%t) Server Stream_Handler::handle_input ")              ACE_TEXT (" (%d) read %b:\n%C\n"),              h, n, buffer));  const char *tok_loc = ACE_OS::strstr (buffer, "goodbye");  if (tok_loc != 0)    this->reactor()->end_event_loop();  else    {      ACE::HTBP::Channel *ch = stream_.session()->outbound();      if (ch != 0)        ACE_DEBUG ((LM_DEBUG,                    ACE_TEXT ("(%P|%t) Server Stream_Handler::handle_input ")                    ACE_TEXT ("Sending reply on %d\n"),                    ch->ace_stream().get_handle()));      else        ACE_DEBUG ((LM_DEBUG,                    ACE_TEXT ("(%P|%t) Server Stream_Handler::handle_input ")                    ACE_TEXT ("Can't send reply on nul channel\n")));      this->stream_.send ("Back atcha!",11);    }  return 0;}intACE_TMAIN (int argc, ACE_TCHAR * argv[]){  ACE_DEBUG ((LM_DEBUG,              ACE_TEXT ("(%P|%t) Server: ")              ACE_TEXT ("At start of main\n")));  ACE_OS::socket_init (ACE_WSOCK_VERSION);  if (parse_args (argc, argv) != 0)    return 1;  ACE_TCHAR host[MAXHOSTNAMELEN+1];  if (ACE_OS::hostname (host, MAXHOSTNAMELEN) != 0)    ACE_ERROR_RETURN ((LM_ERROR,                       ACE_TEXT ("(%P|%t) Server failure: %p\n"),                       ACE_TEXT ("hostname")),                      1);  ACE_INET_Addr local (port, host);  local.addr_to_string (host, MAXHOSTNAMELEN);  ACE_DEBUG ((LM_DEBUG,              ACE_TEXT ("(%P|%t) Server: ")              ACE_TEXT ("listening at %s\n"),              host));  ACE_SOCK_Acceptor acc (local, 1);  ACE_DEBUG ((LM_DEBUG,              ACE_TEXT ("(%P|%t) Server: ")              ACE_TEXT ("opened listener\n")));  Accept_Handler handler (acc);  ACE_DEBUG ((LM_DEBUG,              ACE_TEXT ("(%P|%t) Server: ")              ACE_TEXT ("server is ready\n")));  if (notifier_file != 0)    {      FILE *f = ACE_OS::fopen (notifier_file,ACE_TEXT("w+"));      const char *msg = "server ready";      ACE_OS::fwrite (msg,ACE_OS::strlen(msg),1,f);      ACE_OS::fclose (f);    }  ACE_Reactor::instance()->run_reactor_event_loop();  return 0;}

⌨️ 快捷键说明

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