diff options
Diffstat (limited to 'ACE/examples/Reactor/TP_Reactor/AcceptHandler.cpp')
-rw-r--r-- | ACE/examples/Reactor/TP_Reactor/AcceptHandler.cpp | 106 |
1 files changed, 106 insertions, 0 deletions
diff --git a/ACE/examples/Reactor/TP_Reactor/AcceptHandler.cpp b/ACE/examples/Reactor/TP_Reactor/AcceptHandler.cpp new file mode 100644 index 00000000000..7ae34d2b2b4 --- /dev/null +++ b/ACE/examples/Reactor/TP_Reactor/AcceptHandler.cpp @@ -0,0 +1,106 @@ +/* + * $Id$ + * + * ACE reactor demonstration + * + * Date: 26-Jan-2006 + */ + +#include <ace/Auto_Ptr.h> +#include <ace/INET_Addr.h> + +#include "common.h" +#include "AcceptHandler.h" +#include "ReadHandler.h" + +AcceptHandler:: AcceptHandler(ACE_Reactor *reactor) : + ACE_Event_Handler(), + mReactor(reactor == 0 ? ACE_Reactor::instance() : reactor), + mAcceptor() { + ACE_TRACE("AcceptHandler:: AcceptHandler(ACE_Reactor *)"); +} + +AcceptHandler::~AcceptHandler() { + ACE_TRACE("AcceptHandler::~AcceptHandler()"); +} + +int AcceptHandler::open(void) { + ACE_TRACE("AcceptHandler::open(void)"); + + // create the local address used for the service (PORT is from common.h) + ACE_INET_Addr addr(PORT); + + // open a port using the acceptor; reuse the address later + if (mAcceptor.open(addr, 1) == -1) + ACE_ERROR_RETURN((LM_ERROR, ACE_TEXT("%N:%l: Failed to open ") + ACE_TEXT ("listening socket. (errno = %i: %m)\n"), errno), -1); + + // register the handler with the reactor + if (mReactor->register_handler(this, + ACE_Event_Handler::ACCEPT_MASK) == -1) { + ACE_ERROR((LM_ERROR, ACE_TEXT("%N:%l: Failed to register accept ") + ACE_TEXT ("handler. (errno = %i: %m)\n"), errno)); + + // don't leave the acceptor open + if (mAcceptor.close() == -1) + ACE_ERROR((LM_ERROR, ACE_TEXT("%N:%l: Failed to close the socket ") + ACE_TEXT ("after previous error. (errno = %i: %m)\n"), + errno)); + return -1; + } + + return 0; +} + +ACE_HANDLE AcceptHandler::get_handle(void) const { + ACE_TRACE("AcceptHandler::get_handle(void)"); + return mAcceptor.get_handle(); +} + +int AcceptHandler::handle_input(ACE_HANDLE) { + ACE_TRACE("AcceptHandler::handle_input(ACE_HANDLE)"); + + ACE_INET_Addr clientAddr; + + // create a new ReadHandler + ReadHandler *reader = 0; + ACE_NEW_NORETURN (reader, ReadHandler()); + if (reader == 0) + ACE_ERROR_RETURN((LM_ERROR, ACE_TEXT("%N:%l: Failed to allocate ") + ACE_TEXT ("reader. (errno = %i: %m)\n"), errno), -1); + + // put reader in an auto pointer so we can use ACE_ERROR_RETURN safely + auto_ptr<ReadHandler> pReader(reader); + + // accept the connection using the reader's stream + if (mAcceptor.accept(reader->getStream(), &clientAddr) == -1) + ACE_ERROR_RETURN((LM_ERROR, ACE_TEXT("%N:%l: Failed to accept ") + ACE_TEXT ("client connection. (errno = %i: %m)\n"), errno), -1); + + // register the reader with the reactor + if (mReactor->register_handler(reader, + ACE_Event_Handler::READ_MASK) == -1) + ACE_ERROR_RETURN((LM_ERROR, ACE_TEXT("%N:%l: Failed to register ") + ACE_TEXT ("read handler. (errno = %i: %m)\n"), errno), -1); + + // from now on the read handler takes care of itself + pReader.release(); + + return 0; // keep going +} + +int AcceptHandler::handle_close(ACE_HANDLE, ACE_Reactor_Mask) { + ACE_TRACE("AcceptHandler::handle_close(ACE_HANDLE, ACE_Reactor_Mask)"); + + // close the listening socket + if (mAcceptor.close() == -1) + ACE_ERROR((LM_ERROR, ACE_TEXT("%N:%l: Failed to close the ") + ACE_TEXT ("socket. (errno = %i: %m)\n"), errno)); + + // no need to distinguish between error during close and normal close + // since ACE does not evaluate the return value of handle_close() + + delete this; + return 0; +} + |