diff --git a/SSU.cpp b/SSU.cpp index 1a3d938f..cab234af 100644 --- a/SSU.cpp +++ b/SSU.cpp @@ -1058,6 +1058,30 @@ namespace ssu } m_Sessions.clear (); } + + template + SSUSession * SSUServer::GetRandomSession (Filter filter) + { + std::vector filteredSessions; + for (auto s :m_Sessions) + if (filter (s.second)) filteredSessions.push_back (s.second); + if (filteredSessions.size () > 0) + { + auto ind = i2p::context.GetRandomNumberGenerator ().GenerateWord32 (0, filteredSessions.size ()-1); + return filteredSessions[ind]; + } + return nullptr; + } + + SSUSession * SSUServer::GetRandomEstablishedSession () + { + return GetRandomSession ( + [](SSUSession * session)->bool + { + return session->GetState () == eSessionStateEstablished; + } + ); + } } } diff --git a/SSU.h b/SSU.h index 5a72b4d0..30c61c86 100644 --- a/SSU.h +++ b/SSU.h @@ -147,6 +147,7 @@ namespace ssu SSUSession * GetSession (const i2p::data::RouterInfo * router, bool peerTest = false); SSUSession * FindSession (const i2p::data::RouterInfo * router); SSUSession * FindSession (const boost::asio::ip::udp::endpoint& e); + SSUSession * GetRandomEstablishedSession (); void DeleteSession (SSUSession * session); void DeleteAllSessions (); @@ -162,6 +163,9 @@ namespace ssu void Receive (); void HandleReceivedFrom (const boost::system::error_code& ecode, std::size_t bytes_transferred); + template + SSUSession * GetRandomSession (Filter filter); + private: bool m_IsRunning;