浏览代码

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.

Tatsuhiro Tsujikawa 14 年之前
父节点
当前提交
a9f734218f
共有 2 个文件被更改,包括 26 次插入10 次删除
  1. 8 0
      src/DHTAbstractNodeLookupTask.h
  2. 18 10
      src/DHTPeerLookupTask.cc

+ 8 - 0
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<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);

+ 18 - 10
src/DHTPeerLookupTask.cc

@@ -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;
   }
 }