diff --git a/src/DHTBucket.cc b/src/DHTBucket.cc index ee5d0cae8..04d2bb301 100644 --- a/src/DHTBucket.cc +++ b/src/DHTBucket.cc @@ -232,7 +232,8 @@ SharedHandle DHTBucket::getNode(const unsigned char* nodeID, const std: node->setPort(port); std::deque >::const_iterator itr = std::find_if(nodes_.begin(), nodes_.end(), derefEqual(node)); - if(itr == nodes_.end()) { + if(itr == nodes_.end() || + (*itr)->getIPAddress() != ipaddr || (*itr)->getPort() != port) { return SharedHandle(); } else { return *itr; diff --git a/test/DHTBucketTest.cc b/test/DHTBucketTest.cc index 11adca59a..ff2b7cac3 100644 --- a/test/DHTBucketTest.cc +++ b/test/DHTBucketTest.cc @@ -24,6 +24,7 @@ class DHTBucketTest:public CppUnit::TestFixture { CPPUNIT_TEST(testGetGoodNodes); CPPUNIT_TEST(testCacheNode); CPPUNIT_TEST(testDropNode); + CPPUNIT_TEST(testGetNode); CPPUNIT_TEST_SUITE_END(); public: void setUp() {} @@ -40,6 +41,7 @@ public: void testGetGoodNodes(); void testCacheNode(); void testDropNode(); + void testGetNode(); }; @@ -451,4 +453,23 @@ void DHTBucketTest::testDropNode() CPPUNIT_ASSERT(*cachedNode1 == *bucket.getCachedNodes()[0]); } +void DHTBucketTest::testGetNode() +{ + unsigned char localNodeID[DHT_ID_LENGTH]; + memset(localNodeID, 0, DHT_ID_LENGTH); + SharedHandle localNode(new DHTNode(localNodeID)); + DHTBucket bucket(localNode); + + unsigned char id[DHT_ID_LENGTH]; + createID(id, 0xf0, 0); + SharedHandle node(new DHTNode(id)); + node->setIPAddress("192.168.0.1"); + node->setPort(6881); + CPPUNIT_ASSERT(bucket.addNode(node)); + CPPUNIT_ASSERT(bucket.getNode(id, "192.168.0.1", 6881)); + CPPUNIT_ASSERT(!bucket.getNode(id, "192.168.0.2", 6881)); + CPPUNIT_ASSERT(!bucket.getNode(id, "192.168.0.1", 6882)); + CPPUNIT_ASSERT(!bucket.getNode(localNodeID, "192.168.0.1", 6881)); +} + } // namespace aria2