Don't send announce_peer message with empty token in

DHTPeerLookupTask. Replace old node ID with new node ID when response
message is received in DHTAbstractNodeLookupTask.
pull/1/head
Tatsuhiro Tsujikawa 2011-01-07 00:22:43 +09:00
parent 2dba2f86a4
commit a9f734218f
2 changed files with 26 additions and 10 deletions

View File

@ -173,6 +173,14 @@ public:
void onReceived(const ResponseMessage* message)
{
--inFlightMessage_;
// Replace old Node ID with new Node ID.
for(std::deque<SharedHandle<DHTNodeLookupEntry> >::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<SharedHandle<DHTNode> > nodes;
getNodesFromMessage(nodes, message);

View File

@ -102,17 +102,25 @@ void DHTPeerLookupTask::onFinish()
size_t num = DHTBucket::K;
for(std::deque<SharedHandle<DHTNodeLookupEntry> >::const_iterator i =
getEntries().begin(), eoi = getEntries().end();
i != eoi && num > 0; ++i, --num) {
if((*i)->used) {
const SharedHandle<DHTNode>& node = (*i)->node;
SharedHandle<DHTMessage> 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<DHTNode>& 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<DHTMessage> m =
getMessageFactory()->createAnnouncePeerMessage
(node,
getTargetID(), // this is infoHash
btRuntime_->getListenPort(),
token);
getMessageDispatcher()->addMessageToQueue(m);
--num;
}
}