diff --git a/libi2pd/TransportSession.h b/libi2pd/TransportSession.h index 3ad146cb..87c730f4 100644 --- a/libi2pd/TransportSession.h +++ b/libi2pd/TransportSession.h @@ -113,7 +113,8 @@ namespace transport virtual uint32_t GetRelayTag () const { return 0; }; virtual void SendLocalRouterInfo (bool update = false) { SendI2NPMessages ({ CreateDatabaseStoreMsg () }); }; virtual void SendI2NPMessages (const std::vector >& msgs) = 0; - + virtual bool IsEstablished () const = 0; + protected: std::shared_ptr m_RemoteIdentity; diff --git a/libi2pd/Transports.cpp b/libi2pd/Transports.cpp index 0256e3d9..34fcc065 100644 --- a/libi2pd/Transports.cpp +++ b/libi2pd/Transports.cpp @@ -743,7 +743,12 @@ namespace transport auto ts = i2p::util::GetSecondsSinceEpoch (); for (auto it = m_Peers.begin (); it != m_Peers.end (); ) { - if (it->second.sessions.empty () && ts > it->second.creationTime + SESSION_CREATION_TIMEOUT) + it->second.sessions.remove_if ( + [](std::shared_ptr session)->bool + { + return !session || !session->IsEstablished (); + }); + if (it->second.sessions.empty () && ts > it->second.creationTime + SESSION_CREATION_TIMEOUT) { LogPrint (eLogWarning, "Transports: Session to peer ", it->first.ToBase64 (), " has not been created in ", SESSION_CREATION_TIMEOUT, " seconds"); auto profile = i2p::data::GetRouterProfile(it->first);