diff --git a/src/Session.cxx b/src/Session.cxx index 542852a1fbcaacf018b6e9cf4bd7a4cd02beb00e..a1fc19cc8c6fbfded2ecb7d777d49553d7f3a130 100644 --- a/src/Session.cxx +++ b/src/Session.cxx @@ -47,8 +47,8 @@ void Session::asyncOpen(const std::string& localName, m_socket.async_connect(remoteEndpoint, m_strand.wrap( [this, self] (const boost::system::error_code& error) { if (error) { - onOpenError(error); abortOpen(); + onOpenError(error); } else { startOpen(self); @@ -72,21 +72,21 @@ void Session::startOpen(const std::shared_ptr<Session>& self) boost::asio::async_write(m_socket, boost::make_iterator_range(m_sendBuffers), m_strand.wrap( [this, self] (const boost::system::error_code& error, std::size_t) { if (error) { - onOpenError(error); abortOpen(); + onOpenError(error); return; } // 3. Receive the HELLO message header boost::asio::async_read(m_socket, boost::asio::buffer(m_recvHeader.data()), m_strand.wrap( [this, self] (const boost::system::error_code& error, std::size_t) { if (error) { - onOpenError(error); abortOpen(); + onOpenError(error); return; } if (m_recvHeader.typeId() != HELLO_MESSAGE_ID) { - onOpenError(Error::UNEXPECTED_MESSAGE_TYPE); abortOpen(); + onOpenError(Error::UNEXPECTED_MESSAGE_TYPE); return; } // 4. Receive the HELLO message body @@ -94,8 +94,8 @@ void Session::startOpen(const std::shared_ptr<Session>& self) boost::asio::async_read(m_socket, boost::asio::buffer(*storage), m_strand.wrap( [this, self, storage] (const boost::system::error_code& error, std::size_t) { if (error) { - onOpenError(error); abortOpen(); + onOpenError(error); return; } m_remoteName.insert(m_remoteName.begin(), storage->begin(), storage->end()); @@ -108,11 +108,14 @@ void Session::startOpen(const std::shared_ptr<Session>& self) void Session::abortOpen() { + m_localName.clear(); + m_remoteName.clear(); + m_state = State::CLOSED; + // abortOpen() is called if there was an error in one of the I/O operations in asyncOpen() or // startOpen(). We have to distinguish two cases: // 1) The error occurred because asyncClose() closed m_socket // 2) There was a "real" I/O error - if (m_state == State::CLOSE_PENDING) { // case 1) onClose(); @@ -122,9 +125,6 @@ void Session::abortOpen() boost::system::error_code ignoredError; m_socket.close(ignoredError); } - m_localName.clear(); - m_remoteName.clear(); - m_state = State::CLOSED; } @@ -156,10 +156,10 @@ void Session::asyncClose() void Session::checkClose() { if (m_state == State::CLOSE_PENDING && m_recvNPending == 0 && m_sendQueue.empty()) { - onClose(); m_localName.clear(); m_remoteName.clear(); m_state = State::CLOSED; + onClose(); } }