diff --git a/src/DHTAbstractNodeLookupTask.h b/src/DHTAbstractNodeLookupTask.h index f5435ad5..cf71470e 100644 --- a/src/DHTAbstractNodeLookupTask.h +++ b/src/DHTAbstractNodeLookupTask.h @@ -173,6 +173,14 @@ public: void onReceived(const ResponseMessage* message) { --inFlightMessage_; + // Replace old Node ID with new Node ID. + for(std::deque >::iterator i = + entries_.begin(), eoi = entries_.end(); i != eoi; ++i) { + if((*i)->node->getIPAddress() == message->getRemoteNode()->getIPAddress() + && (*i)->node->getPort() == message->getRemoteNode()->getPort()) { + (*i)->node = message->getRemoteNode(); + } + } onReceivedInternal(message); std::vector > nodes; getNodesFromMessage(nodes, message); diff --git a/src/DHTPeerLookupTask.cc b/src/DHTPeerLookupTask.cc index 94c0de12..baf54093 100644 --- a/src/DHTPeerLookupTask.cc +++ b/src/DHTPeerLookupTask.cc @@ -102,17 +102,25 @@ void DHTPeerLookupTask::onFinish() size_t num = DHTBucket::K; for(std::deque >::const_iterator i = getEntries().begin(), eoi = getEntries().end(); - i != eoi && num > 0; ++i, --num) { - if((*i)->used) { - const SharedHandle& node = (*i)->node; - SharedHandle m = - getMessageFactory()->createAnnouncePeerMessage - (node, - getTargetID(), // this is infoHash - btRuntime_->getListenPort(), - tokenStorage_[util::toHex(node->getID(), DHT_ID_LENGTH)]); - getMessageDispatcher()->addMessageToQueue(m); + i != eoi && num > 0; ++i) { + if(!(*i)->used) { + continue; } + const SharedHandle& node = (*i)->node; + std::string idHex = util::toHex(node->getID(), DHT_ID_LENGTH); + std::string token = tokenStorage_[idHex]; + if(token.empty()) { + A2_LOG_DEBUG(fmt("Token is empty for ID:%s", idHex.c_str())); + continue; + } + SharedHandle m = + getMessageFactory()->createAnnouncePeerMessage + (node, + getTargetID(), // this is infoHash + btRuntime_->getListenPort(), + token); + getMessageDispatcher()->addMessageToQueue(m); + --num; } }