accepthandler.cpp

来自「ace开发环境 用来开发网络程序 其运用了设计模式、多平台、C++等多种知识」· C++ 代码 · 共 107 行

CPP
107
字号
/* * $Id: AcceptHandler.cpp 71351 2006-03-01 23:48:42Z shuston $ * * 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;}

⌨️ 快捷键说明

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