bool Session_T<ACE_SYNCH_USE>::connect (bool use_reactor) { INET_TRACE ("ACE_FTP_Session::connect"); typedef ACE_Connector<connection_type, ACE_SOCK_CONNECTOR> connector_type; this->close (); unsigned long f_reactor = use_reactor ? ACE_Synch_Options::USE_REACTOR : 0; ACE_Synch_Options sync_opt (ACE_Synch_Options::USE_TIMEOUT | f_reactor, this->ftp_timeout_); connector_type connector; connection_type* new_connection = 0; ACE_NEW_RETURN (new_connection, connection_type(sync_opt), false); if (connector.connect (new_connection, ACE_INET_Addr (this->port_, this->host_.c_str ()), ACE_Synch_Options (0,this->ftp_timeout_)) == -1) { INET_ERROR (1, (LM_ERROR, DLINFO ACE_TEXT ("(%d) ACE_FTP_Session::connect - ") ACE_TEXT ("failed to connect; host=%C, port=%d"), ACE_OS::last_error (), this->host_.c_str (), this->port_)); // as the connection was dynamically allocated // the connector causes it to be destroyed after // the connection failure return false; } this->connection_ = new_connection; this->connection_->reference_counting_policy ().value ( ACE_Event_Handler::Reference_Counting_Policy::ENABLED); ACE_NEW_NORETURN (this->sock_stream_, sock_stream_type (this->connection_)); if (this->sock_stream_) { this->new_connect_ = true; this->cannot_reconnect_ = false; this->reactive_ = use_reactor; return true; } else { this->close (); return false; } }
bool Session_T<ACE_SYNCH_USE>::connect_i (const ACE_Synch_Options& sync_opt) { INET_TRACE ("ACE_HTTP_Session::connect_i"); typedef ACE_Connector<connection_type, ACE_SOCK_CONNECTOR> connector_type; connector_type connector; connection_type* new_connection = 0; ACE_NEW_RETURN (new_connection, connection_type(sync_opt), false); if (connector.connect (new_connection, ACE_INET_Addr (this->port_, this->host_.c_str ()), ACE_Synch_Options (0,this->http_timeout_)) == -1) { INET_ERROR (1, (LM_ERROR, DLINFO ACE_TEXT ("(%d) ACE_HTTP_Session::connect_i - ") ACE_TEXT ("failed to connect; host=%C, port=%d\n"), ACE_OS::last_error (), this->host_.c_str (), this->port_)); // as the connection was dynamically allocated // the connector causes it to be destroyed after // the connection failure return false; } this->connection_ = new_connection; this->connection_->reference_counting_policy ().value ( ACE_Event_Handler::Reference_Counting_Policy::ENABLED); ACE_NEW_NORETURN (this->sock_stream_, sock_stream_type (this->connection_)); if (this->sock_stream_) { this->cannot_reconnect_ = false; this->reactive_ = sync_opt[ACE_Synch_Options::USE_REACTOR]; // reset reconnect timer this->reconnect_timer_ = this->keep_alive_timeout_; this->reconnect_countdown_.start (); return true; } else { this->close (); return false; } }
ClientRequestHandler::stream_type* ClientRequestHandler::open_data_connection (const ACE_CString& cmd, const ACE_CString& arg) { if (this->use_passive_mode_) { // get address for passive data connection ACE_INET_Addr data_addr; if (this->get_passive_address (data_addr)) { // establish data connection // copy sync settings from session unsigned long f_reactor = this->session ()->is_reactive() ? ACE_Synch_Options::USE_REACTOR : 0; ACE_Synch_Options sync_opt (ACE_Synch_Options::USE_TIMEOUT | f_reactor, this->session ()->timeout ()); typedef ACE_Connector<SessionHolder::session_type::connection_type, ACE_SOCK_CONNECTOR> connector_type; connector_type connector; // create connection object (stream handler) SessionHolder::session_type::connection_type* data_connection = 0; ACE_NEW_NORETURN (data_connection, SessionHolder::session_type::connection_type(sync_opt)); if (data_connection == 0) { return 0; } // connect to data connection address if (connector.connect (data_connection, data_addr, ACE_Synch_Options (0, this->session ()->timeout ())) == -1) { INET_ERROR (1, (LM_ERROR, DLINFO ACE_TEXT ("(%d) ACE_FTP_ClientRequestHandler::open_data_connection - ") ACE_TEXT ("failed to connect to %C:%d\n"), ACE_OS::last_error (), data_addr.get_host_name (), data_addr.get_port_number ())); // as the connection was dynamically allocated // the connector causes it to be destroyed after // the connection failure return 0; } // enable ref counting so we can control when to destroy data_connection->reference_counting_policy ().value ( ACE_Event_Handler::Reference_Counting_Policy::ENABLED); // create io stream for connection stream_type* data_stream = 0; ACE_NEW_NORETURN (data_stream, stream_type (data_connection)); if (data_stream) { if (this->process_command (cmd, arg) == Response::PRELIM_OK) return data_stream; delete data_stream; // decreases ref count on connection } // remove last ref count -> delete data_connection->remove_reference (); } } else { // address for active data connection ACE_INET_Addr data_addr; this->session ()->get_local_addr (data_addr); data_addr.set_port_number (this->active_port_); // copy sync settings from session unsigned long f_reactor = this->session ()->is_reactive() ? ACE_Synch_Options::USE_REACTOR : 0; ACE_Synch_Options sync_opt (ACE_Synch_Options::USE_TIMEOUT | f_reactor, this->session ()->timeout ()); typedef ACE_Oneshot_Acceptor<SessionHolder::session_type::connection_type, ACE_SOCK_ACCEPTOR> acceptor_type; acceptor_type acceptor; // start data connection acceptor listening and retrieve actual listening address if (acceptor.open (data_addr) == 0 && acceptor.acceptor ().get_local_addr (data_addr) == 0) { // send listen address to peer followed by data command to execute if (this->send_active_address (data_addr) && this->process_command (cmd, arg) == Response::PRELIM_OK) { // create connection object (stream handler) SessionHolder::session_type::connection_type* data_connection = 0; ACE_NEW_NORETURN (data_connection, SessionHolder::session_type::connection_type(sync_opt)); if (data_connection == 0) { return 0; } // accept data connection from peer if (acceptor.accept (data_connection, 0, ACE_Synch_Options (ACE_Synch_Options::USE_TIMEOUT, this->session ()->timeout ())) == -1) { INET_ERROR (1, (LM_ERROR, DLINFO ACE_TEXT ("(%d) ACE_FTP_ClientRequestHandler::open_data_connection - ") ACE_TEXT ("failed to accept connection to %C:%d\n"), ACE_OS::last_error (), data_addr.get_host_name (), data_addr.get_port_number ())); // as the connection was dynamically allocated // the acceptor causes it to be destroyed after // the connection failure return 0; } // enable ref counting so we can control when to destroy data_connection->reference_counting_policy ().value ( ACE_Event_Handler::Reference_Counting_Policy::ENABLED); // create io stream for connection stream_type* data_stream = 0; ACE_NEW_NORETURN (data_stream, stream_type (data_connection)); if (data_stream) { return data_stream; } // remove last ref count -> delete data_connection->remove_reference (); } } } return 0; }