www.pudn.com > server_client.rar > Thread_Per_Connection_Logging_Server.h, change:2007-10-18,size:2760b


/* 
** 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 */