diff --git a/NTCPSession.cpp b/NTCPSession.cpp index 2584f584..b0ea2e74 100644 --- a/NTCPSession.cpp +++ b/NTCPSession.cpp @@ -93,9 +93,7 @@ namespace transport m_DHKeysPair = nullptr; - SendTimeSyncMessage (); - m_SendQueue.push_back (CreateDatabaseStoreMsg ()); // we tell immediately who we are - + SendTimeSyncMessage (); transports.PeerConnected (shared_from_this ()); } diff --git a/SSUSession.cpp b/SSUSession.cpp index 1fa29475..aa534c56 100644 --- a/SSUSession.cpp +++ b/SSUSession.cpp @@ -855,7 +855,6 @@ namespace transport m_DHKeysPair = nullptr; m_SignedData = nullptr; m_Data.Start (); - m_Data.Send (CreateDatabaseStoreMsg ()); transports.PeerConnected (shared_from_this ()); if (m_IsPeerTest) SendPeerTest (); diff --git a/Transports.cpp b/Transports.cpp index 5fcce0fc..9b327133 100644 --- a/Transports.cpp +++ b/Transports.cpp @@ -505,12 +505,24 @@ namespace transport auto it = m_Peers.find (ident); if (it != m_Peers.end ()) { + bool sendDatabaseStore = true; + if (it->second.delayedMessages.size () > 0) + { + // check if first message is our DatabaseStore (publishing) + auto firstMsg = it->second.delayedMessages[0]; + if (firstMsg && firstMsg->GetTypeID () == eI2NPDatabaseStore && + i2p::data::IdentHash(firstMsg->GetPayload () + DATABASE_STORE_KEY_OFFSET) == i2p::context.GetIdentHash ()) + sendDatabaseStore = false; // we have it in the list already + } + if (sendDatabaseStore) + session->SendI2NPMessages ({ CreateDatabaseStoreMsg () }); it->second.sessions.push_back (session); session->SendI2NPMessages (it->second.delayedMessages); it->second.delayedMessages.clear (); } else // incoming connection { + session->SendI2NPMessages ({ CreateDatabaseStoreMsg () }); // send DatabaseStore std::unique_lock l(m_PeersMutex); m_Peers.insert (std::make_pair (ident, Peer{ 0, nullptr, { session }, i2p::util::GetSecondsSinceEpoch (), {} })); }