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

📄 thread_per_connection_logging_server.h

📁 ACE 学习代码。用ACE实现的学习代码
💻 H
字号:
/*
** Thread_Per_Connection_Logging_Server.h,v 1.3 2002/07/02 19:58:23 shuston Exp
**
** Copyright 2001 Addison Wesley. All Rights Reserved.
*/

#ifndef _THREAD_PER_CONNECTION_LOGGING_SERVER_H
#define _THREAD_PER_CONNECTION_LOGGING_SERVER_H

#include "ace/SOCK_Stream.h"
#include "Logging_Server.h"
#include "Logging_Handler.h"

class Thread_Per_Connection_Logging_Server : public Logging_Server
{
private:
  struct Thread_Args {
    Thread_Args (Thread_Per_Connection_Logging_Server *lsp) : this_ (lsp) {}
    Thread_Per_Connection_Logging_Server *this_;
    ACE_SOCK_Stream logging_peer_;
  };

  // Passed as a parameter to <ACE_Thread_Manager::spawn>.

static ACE_THR_FUNC_RETURN Thread_Per_Connection_Logging_Server::run_svc (void *arg)
{
  Thread_Args *thread_args = ACE_static_cast (Thread_Args *, arg);

  thread_args->this_->handle_data (&thread_args->logging_peer_);
  thread_args->logging_peer_.close ();
  delete thread_args;
  return 0;    // Return value is ignored
}

protected:

virtual int Thread_Per_Connection_Logging_Server::handle_connections ()
{
  Thread_Args *thread_args = new Thread_Args (this);

  if (acceptor ().accept (thread_args->logging_peer_) == -1)
    return -1;
  if (ACE_Thread_Manager::instance ()->spawn (
                   // Pointer to function entry point.
                  Thread_Per_Connection_Logging_Server::run_svc,
                   // <run_svc> parameter.
                  ACE_static_cast (void *, thread_args),
                  THR_DETACHED | THR_SCOPE_SYSTEM) == -1)
  {
    return -1;
  }
  else
  {	
	  return 0;
  }
}

virtual int Thread_Per_Connection_Logging_Server::handle_data (ACE_SOCK_Stream *client)
{
  ACE_FILE_IO log_file;
  // thread isn't doing anything except handling this client.
  client->disable (ACE_NONBLOCK);

  Logging_Handler logging_handler (log_file, *client);

  // Keep handling log records until client closes connection
  // or this thread is asked to cancel itself.
  ACE_Thread_Manager *mgr = ACE_Thread_Manager::instance ();
  ACE_thread_t me = ACE_Thread::self ();
  while (!mgr->testcancel (me) &&
        logging_handler.log_record () != -1)
    continue;
  return 0;
}


public:
  // Template Method that runs logging server's event loop. Need to
  // reimplement this here because the threads spawned from handle_connections
  // call handle_data; therefore, this method must not.
  virtual int run (u_short server_port) {
    if (open (server_port) == -1)
      return -1;
    for (;;) {
      if (handle_connections () == -1)
        return -1;
    }
    return 0;
  }
};
Thread_Per_Connection_Logging_Server server;
#endif /* _THREAD_PER_CONNECTION_LOGGING_SERVER_H */

⌨️ 快捷键说明

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