فهرست منبع

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 15 سال پیش
والد
کامیت
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;
   }
 }