📄 ha_proactive_status.cpp
字号:
/*** HA_Proactive_Status.cpp,v 1.9 2005/01/21 02:19:19 ossama Exp**** Example program from The ACE Programmer's Guide, Chapter 8.** Copyright 2003 Addison-Wesley. All Rights Reserved.*/#include "HA_Proactive_Status.h"#include "ace/Log_Msg.h"#include "ace/Message_Block.h"#include "ace/Proactor.h"#include "ace/os_include/arpa/os_inet.h"#if (defined (ACE_WIN32) && !defined (ACE_HAS_WINCE)) || (defined (ACE_HAS_AIO_CALLS))// Listing 1 code/ch08voidHA_Proactive_Service::open (ACE_HANDLE h, ACE_Message_Block&){ this->handle (h); if (this->reader_.open (*this) != 0 || this->writer_.open (*this) != 0 ) { ACE_ERROR ((LM_ERROR, ACE_TEXT ("%p\n"), ACE_TEXT ("HA_Proactive_Service open"))); delete this; return; } ACE_Message_Block *mb; ACE_NEW_NORETURN (mb, ACE_Message_Block (1024)); if (this->reader_.read (*mb, mb->space ()) != 0) { ACE_ERROR ((LM_ERROR, ACE_TEXT ("%p\n"), ACE_TEXT ("HA_Proactive_Service begin read"))); mb->release (); delete this; return; } // mb is now controlled by Proactor framework. return;}// Listing 1// Listing 2 code/ch08voidHA_Proactive_Service::handle_read_stream (const ACE_Asynch_Read_Stream::Result &result){ ACE_Message_Block &mb = result.message_block (); if (!result.success () || result.bytes_transferred () == 0) { mb.release (); delete this; } else { if (this->writer_.write (mb, mb.length ()) != 0) { ACE_ERROR ((LM_ERROR, ACE_TEXT ("%p\n"), ACE_TEXT ("starting write"))); mb.release (); } else { ACE_Message_Block *new_mb; ACE_NEW_NORETURN (new_mb, ACE_Message_Block (1024)); this->reader_.read (*new_mb, new_mb->space ()); } } return;}// Listing 2// Listing 3 code/ch08voidHA_Proactive_Service::handle_write_stream(const ACE_Asynch_Write_Stream::Result &result){ result.message_block ().release (); return;}// Listing 3// The network address check only works for BSD-ish systems. This// sort of network number accessor should be added to ACE_INET_Addr// at some point...#if defined (ACE_WIN32)intHA_Proactive_Acceptor::validate_connection(const ACE_Asynch_Accept::Result&, const ACE_INET_Addr&, const ACE_INET_Addr&){ return 0;}#else// Listing 4 code/ch08intHA_Proactive_Acceptor::validate_connection ( const ACE_Asynch_Accept::Result&, const ACE_INET_Addr& remote, const ACE_INET_Addr& local){ struct in_addr *remote_addr = reinterpret_cast<struct in_addr*> (remote.get_addr ()); struct in_addr *local_addr = reinterpret_cast<struct in_addr*> (local.get_addr ()); if (inet_netof (*local_addr) == inet_netof (*remote_addr)) return 0; return -1;}// Listing 4#endif /* ACE_WIN32 */intACE_TMAIN (int, ACE_TCHAR *[]){ // Listing 5 code/ch08 ACE_INET_Addr listen_addr; // Set up with listen port HA_Proactive_Acceptor aio_acceptor; if (0 != aio_acceptor.open (listen_addr, 0, // bytes_to_read 0, // pass_addresses ACE_DEFAULT_BACKLOG, 1, // reuse_addr 0, // proactor 1)) // validate_new_connection ACE_ERROR_RETURN ((LM_ERROR, ACE_TEXT ("%p\n"), ACE_TEXT ("acceptor open")), 1); // Listing 5#if 0 // Listing 6 code/ch08 ACE_INET_Addr peer_addr; // Set up peer addr ACE_Asynch_Connector<HA_Proactive_Service> aio_connect; aio_connect.connect (peer_addr); // Listing 6#endif // Listing 7 code/ch08 ACE_Proactor::instance ()->proactor_run_event_loop (); // Listing 7 return 0;}#if defined (ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION)template class ACE_Asynch_Acceptor<HA_Proactive_Service>;#elif defined (ACE_HAS_TEMPLATE_INSTANTIATION_PRAGMA)#pragma instantiate ACE_Asynch_Acceptor<HA_Proactive_Service>#endif /* ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION*/#elseintACE_TMAIN (int, ACE_TCHAR *[]){ ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("This example requires asynchronous I/O support.\n"))); return 1;}#endif /* (ACE_WIN32 && != ACE_HAS_WINCE) || ACE_HAS_AIO_CALLS*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -