logging_handler.cpp
来自「ace开发环境 用来开发网络程序 其运用了设计模式、多平台、C++等多种知识」· C++ 代码 · 共 203 行
CPP
203 行
// $Id: Logging_Handler.cpp 77084 2007-02-12 20:27:02Z shuston $#include "ace/Log_Msg.h"#include "ace/Message_Block.h"#include "ace/Log_Record.h"#include "ace/OS_NS_string.h"#include "ace/CDR_Stream.h"#include "ace/Auto_Ptr.h"#include "Logging_Handler.h"#include "Reactor_Singleton.h"ACE_RCSID(simple_server, Logging_Handler, "$Id: Logging_Handler.cpp 77084 2007-02-12 20:27:02Z shuston $")// Default constructor.Logging_Handler::Logging_Handler (void){}Logging_Handler::~Logging_Handler (void){ // Make sure there are no timers. REACTOR::instance ()->cancel_timer (this); this->cli_stream_.close ();}// Extract the underlying ACE_SOCK_Stream (e.g., for purposes of// accept()).ACE_SOCK_Stream &Logging_Handler::peer (void){ return this->cli_stream_;}intLogging_Handler::handle_timeout (const ACE_Time_Value &, const void *arg){#if defined (ACE_NDEBUG) ACE_UNUSED_ARG (arg);#endif /* ACE_NDEBUG */ ACE_ASSERT (arg == this); ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("(%P|%t) handling timeout from this = %@\n"), this)); return 0;}// Perform the logging record receive.intLogging_Handler::handle_input (ACE_HANDLE){ ACE_Log_Record log_record; // We need to use the old two-read trick here since TCP sockets // don't support framing natively. Allocate a message block for the // payload; initially at least large enough to hold the header, but // needs some room for alignment. ACE_Message_Block *payload_p = 0; ACE_Message_Block *header_p = 0; ACE_NEW_RETURN (header_p, ACE_Message_Block (ACE_DEFAULT_CDR_BUFSIZE), -1); auto_ptr <ACE_Message_Block> header (header_p); // Align the Message Block for a CDR stream ACE_CDR::mb_align (header.get ()); ACE_CDR::Boolean byte_order; ACE_CDR::ULong length; ssize_t count = ACE::recv_n (this->peer ().get_handle (), header->wr_ptr (), 8); switch (count) { // Handle shutdown and error cases. default: case -1: case 0: ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("server logging daemon closing down\n"))); return -1; /* NOTREACHED */ case 8: // Just fall through in this case.. break; } header->wr_ptr (8); // Reflect addition of 8 bytes. // Create a CDR stream to parse the 8-byte header. ACE_InputCDR header_cdr (header.get ()); // Extract the byte-order and use helper methods to disambiguate // octet, booleans, and chars. header_cdr >> ACE_InputCDR::to_boolean (byte_order); // Set the byte-order on the stream... header_cdr.reset_byte_order (byte_order); // Extract the length header_cdr >> length; ACE_NEW_RETURN (payload_p, ACE_Message_Block (length), -1); auto_ptr <ACE_Message_Block> payload (payload_p); // Ensure there's sufficient room for log record payload. ACE_CDR::grow (payload.get (), 8 + ACE_CDR::MAX_ALIGNMENT + length); // Use <recv_n> to obtain the contents. if (ACE::recv_n (this->peer ().get_handle (), payload->wr_ptr (), length) <= 0) { ACE_ERROR ((LM_ERROR, ACE_TEXT ("%p\n"), ACE_TEXT ("recv_n()"))); return -1; } payload->wr_ptr (length); // Reflect additional bytes ACE_InputCDR payload_cdr (payload.get ()); payload_cdr.reset_byte_order (byte_order); payload_cdr >> log_record; // Finally extract the <ACE_log_record>. log_record.length (length); log_record.print (ACE_TEXT_CHAR_TO_TCHAR (this->host_name_), 1, stderr); return 0;}// Extract underlying device descriptor.ACE_HANDLELogging_Handler::get_handle (void) const{ return this->cli_stream_.get_handle ();}intLogging_Handler::open (void){ ACE_INET_Addr addr; if (this->cli_stream_.get_remote_addr (addr) == -1) return -1; else { ACE_OS::strncpy (this->host_name_, addr.get_host_name (), MAXHOSTNAMELEN + 1); if (REACTOR::instance ()->register_handler (this, READ_MASK) == -1) ACE_ERROR_RETURN ((LM_ERROR, ACE_TEXT ("(%P|%t) can't register with reactor\n")), -1); else if (REACTOR::instance ()->schedule_timer (this, (const void *) this, ACE_Time_Value (2), ACE_Time_Value (2)) == -1) ACE_ERROR_RETURN ((LM_ERROR, ACE_TEXT ("(%P|%t) can't register with reactor\n")), -1); else ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("(%P|%t) connected with %C\n"), this->host_name_)); return 0; }}// Perform termination activities when deregistered from the// ACE_Reactor.intLogging_Handler::handle_close (ACE_HANDLE, ACE_Reactor_Mask){ // Must have been allocated dynamically delete this; return 0;}// Perform termination activities when close fails.intLogging_Handler::close (void){ return this->handle_close ();}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?