int32_t CCoreTCPListener::handle_input(BASE_HANDLER handle) { while(true) //EPOLL ET模式是需要将事件全部处理干净,直到状态EAGAIN { Inet_Addr remote_addr; CConnection *conn = CONNECTION_POOL.pop_obj(); conn->reset(); if(acceptor_.accept(conn->get_sock_stream(), remote_addr, true) == 0) { CORE_INFO("accept tcp connection, remote addr = " << remote_addr); conn->set_remote_addr(remote_addr); if(REACTOR_INSTANCE()->register_handler(conn, MASK_WRITE | MASK_READ) == 0) { conn->set_state(CConnection::CONN_CONNECTING); CORE_INFO("pop conn = " << conn); } else { conn->reset(); CONNECTION_POOL.push_obj(conn); } #ifdef WIN32 return 0; #endif } else { conn->reset(); CONNECTION_POOL.push_obj(conn); #ifndef WIN32 if (errno != EAGAIN && errno != ECONNABORTED && errno != EPROTO && errno != EINTR) { CORE_DEBUG("push conn = " << this); CORE_FATAL("tcp listener accept failed!"); return -2; } else { return 0; } #else return -2; #endif } } return 0; }