diff options
| author | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2010-08-07 14:15:21 +0000 |
|---|---|---|
| committer | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2010-08-07 14:15:21 +0000 |
| commit | 26d66923767581d63fdfc303525cddebf9125bde (patch) | |
| tree | 97eb6054d697b53c7296adfaeaa43fb8013de3f2 /src/DHTFindNodeReplyMessage.cc | |
| parent | be7012272dbd029a7843df43466f4cd83e6fb9e3 (diff) | |
2010-08-07 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
Added IPv6 DHT. Added --dht-entry-porint6, --dht-file-path6,
--dht-listen-addr6 and --enable-dht6 option. IPv6 DHT is disabled
by default. To use IPv6 DHT, you need to use --enable-dht6 and
specify a global unicast address to --dht-listen-addr6. IPv6 DHT
is highly experimental.
* src/BtSetup.cc
* src/DHTAutoSaveCommand.cc
* src/DHTAutoSaveCommand.h
* src/DHTConnectionImpl.cc
* src/DHTConnectionImpl.h
* src/DHTEntryPointNameResolveCommand.cc
* src/DHTFindNodeReplyMessage.cc
* src/DHTFindNodeReplyMessage.h
* src/DHTGetPeersMessage.cc
* src/DHTGetPeersReplyMessage.cc
* src/DHTGetPeersReplyMessage.h
* src/DHTMessageFactory.h
* src/DHTMessageFactoryImpl.cc
* src/DHTMessageFactoryImpl.h
* src/DHTMessageTracker.cc
* src/DHTRegistry.cc
* src/DHTRegistry.h
* src/DHTRoutingTableDeserializer.cc
* src/DHTRoutingTableDeserializer.h
* src/DHTRoutingTableSerializer.cc
* src/DHTRoutingTableSerializer.h
* src/DHTSetup.cc
* src/DHTSetup.h
* src/FtpConnection.cc
* src/LpdMessageReceiver.cc
* src/OptionHandlerFactory.cc
* src/OptionHandlerImpl.h
* src/PeerInteractionCommand.cc
* src/RequestGroup.cc
* src/SocketCore.cc
* src/SocketCore.h
* src/bittorrent_helper.cc
* src/bittorrent_helper.h
* src/prefs.cc
* src/prefs.h
* src/usage_text.h
* test/DHTConnectionImplTest.cc
* test/DHTFindNodeReplyMessageTest.cc
* test/DHTGetPeersMessageTest.cc
* test/DHTGetPeersReplyMessageTest.cc
* test/DHTMessageFactoryImplTest.cc
* test/DHTRoutingTableDeserializerTest.cc
* test/DHTRoutingTableSerializerTest.cc
* test/LpdMessageDispatcherTest.cc
* test/MockDHTMessageFactory.h
Diffstat (limited to 'src/DHTFindNodeReplyMessage.cc')
| -rw-r--r-- | src/DHTFindNodeReplyMessage.cc | 24 |
1 files changed, 16 insertions, 8 deletions
diff --git a/src/DHTFindNodeReplyMessage.cc b/src/DHTFindNodeReplyMessage.cc index 99acbce1..4c255332 100644 --- a/src/DHTFindNodeReplyMessage.cc +++ b/src/DHTFindNodeReplyMessage.cc @@ -51,11 +51,15 @@ const std::string DHTFindNodeReplyMessage::FIND_NODE("find_node"); const std::string DHTFindNodeReplyMessage::NODES("nodes"); +const std::string DHTFindNodeReplyMessage::NODES6("nodes6"); + DHTFindNodeReplyMessage::DHTFindNodeReplyMessage -(const SharedHandle<DHTNode>& localNode, +(int family, + const SharedHandle<DHTNode>& localNode, const SharedHandle<DHTNode>& remoteNode, const std::string& transactionID): - DHTResponseMessage(localNode, remoteNode, transactionID) {} + DHTResponseMessage(localNode, remoteNode, transactionID), + family_(family) {} DHTFindNodeReplyMessage::~DHTFindNodeReplyMessage() {} @@ -73,23 +77,27 @@ SharedHandle<Dict> DHTFindNodeReplyMessage::getResponse() { SharedHandle<Dict> aDict = Dict::g(); aDict->put(DHTMessage::ID, String::g(getLocalNode()->getID(), DHT_ID_LENGTH)); + unsigned char buffer[DHTBucket::K*38]; + const int clen = bittorrent::getCompactLength(family_); + const int unit = clen+20; + assert(unit <= 38); size_t offset = 0; - unsigned char buffer[DHTBucket::K*26]; - // TODO if closestKNodes_.size() > DHTBucket::K ?? + size_t k = 0; for(std::vector<SharedHandle<DHTNode> >::const_iterator i = closestKNodes_.begin(), eoi = closestKNodes_.end(); - i != eoi && offset < DHTBucket::K*26; ++i) { + i != eoi && k < DHTBucket::K; ++i) { SharedHandle<DHTNode> node = *i; memcpy(buffer+offset, node->getID(), DHT_ID_LENGTH); unsigned char compact[COMPACT_LEN_IPV6]; int compactlen = bittorrent::packcompact (compact, node->getIPAddress(), node->getPort()); - if(compactlen == COMPACT_LEN_IPV4) { + if(compactlen == clen) { memcpy(buffer+20+offset, compact, compactlen); - offset += 26; + offset += unit; + ++k; } } - aDict->put(NODES, String::g(buffer, offset)); + aDict->put(family_ == AF_INET?NODES:NODES6, String::g(buffer, offset)); return aDict; } |
