diff options
| author | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2010-08-05 11:54:44 +0000 |
|---|---|---|
| committer | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2010-08-05 11:54:44 +0000 |
| commit | c685ea9de9efdea119828ded02414f72b8271f31 (patch) | |
| tree | 055e64aa8742f6e08e085751c146cb3a188a0d61 /src | |
| parent | cba1283aaed888f4602b3e1426b0edf5aaf823fe (diff) | |
2010-08-05 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
Added support for peers6 key in tracker response. Added added6,
added6.f and dropped6 in ut_pex.
* src/BtAnnounce.cc
* src/BtAnnounce.h
* src/DefaultBtAnnounce.cc
* src/UTPexExtensionMessage.cc
* src/UTPexExtensionMessage.h
* test/DefaultBtAnnounceTest.cc
* test/UTPexExtensionMessageTest.cc
Diffstat (limited to 'src')
| -rw-r--r-- | src/BtAnnounce.cc | 2 | ||||
| -rw-r--r-- | src/BtAnnounce.h | 2 | ||||
| -rw-r--r-- | src/DefaultBtAnnounce.cc | 10 | ||||
| -rw-r--r-- | src/UTPexExtensionMessage.cc | 45 | ||||
| -rw-r--r-- | src/UTPexExtensionMessage.h | 4 |
5 files changed, 55 insertions, 8 deletions
diff --git a/src/BtAnnounce.cc b/src/BtAnnounce.cc index 64976a26..25b321d7 100644 --- a/src/BtAnnounce.cc +++ b/src/BtAnnounce.cc @@ -52,4 +52,6 @@ const std::string BtAnnounce::INCOMPLETE("incomplete"); const std::string BtAnnounce::PEERS("peers"); +const std::string BtAnnounce::PEERS6("peers6"); + } // namespace aria2 diff --git a/src/BtAnnounce.h b/src/BtAnnounce.h index 4c25aa95..9d42b195 100644 --- a/src/BtAnnounce.h +++ b/src/BtAnnounce.h @@ -123,6 +123,8 @@ public: static const std::string PEERS; + static const std::string PEERS6; + static const time_t DEFAULT_ANNOUNCE_INTERVAL = 120; }; diff --git a/src/DefaultBtAnnounce.cc b/src/DefaultBtAnnounce.cc index e47cf6b6..5ea3ebdc 100644 --- a/src/DefaultBtAnnounce.cc +++ b/src/DefaultBtAnnounce.cc @@ -280,6 +280,16 @@ DefaultBtAnnounce::processAnnounceResponse(const unsigned char* trackerResponse, peerStorage_->addPeer(peers); } } + const SharedHandle<ValueBase>& peer6Data = dict->get(BtAnnounce::PEERS6); + if(peer6Data.isNull()) { + logger_->info("No peers6 received."); + } else { + if(!btRuntime_->isHalt() && btRuntime_->lessThanMinPeers()) { + std::vector<SharedHandle<Peer> > peers; + bittorrent::extractPeer(peer6Data, AF_INET6, std::back_inserter(peers)); + peerStorage_->addPeer(peers); + } + } } bool DefaultBtAnnounce::noMoreAnnounce() { diff --git a/src/UTPexExtensionMessage.cc b/src/UTPexExtensionMessage.cc index 4618850f..3ac1e9a1 100644 --- a/src/UTPexExtensionMessage.cc +++ b/src/UTPexExtensionMessage.cc @@ -58,24 +58,41 @@ UTPexExtensionMessage::~UTPexExtensionMessage() {} std::string UTPexExtensionMessage::getPayload() { - std::pair<std::string, std::string> freshPeerPair = + std::pair<std::pair<std::string, std::string>, + std::pair<std::string, std::string> > freshPeerPair = createCompactPeerListAndFlag(freshPeers_); - std::pair<std::string, std::string> droppedPeerPair = + std::pair<std::pair<std::string, std::string>, + std::pair<std::string, std::string> > droppedPeerPair = createCompactPeerListAndFlag(droppedPeers_); Dict dict; - dict.put("added", freshPeerPair.first); - dict.put("added.f", freshPeerPair.second); - dict.put("dropped", droppedPeerPair.first); + if(!freshPeerPair.first.first.empty()) { + dict.put("added", freshPeerPair.first.first); + dict.put("added.f", freshPeerPair.first.second); + } + if(!droppedPeerPair.first.first.empty()) { + dict.put("dropped", droppedPeerPair.first.first); + } + if(!freshPeerPair.second.first.empty()) { + dict.put("added6", freshPeerPair.second.first); + dict.put("added6.f", freshPeerPair.second.second); + } + if(!droppedPeerPair.second.first.empty()) { + dict.put("dropped6", droppedPeerPair.second.first); + } + return bencode2::encode(&dict); } -std::pair<std::string, std::string> +std::pair<std::pair<std::string, std::string>, + std::pair<std::string, std::string> > UTPexExtensionMessage::createCompactPeerListAndFlag (const std::vector<SharedHandle<Peer> >& peers) { std::string addrstring; std::string flagstring; + std::string addrstring6; + std::string flagstring6; for(std::vector<SharedHandle<Peer> >::const_iterator itr = peers.begin(), eoi = peers.end(); itr != eoi; ++itr) { unsigned char compact[COMPACT_LEN_IPV6]; @@ -84,9 +101,13 @@ UTPexExtensionMessage::createCompactPeerListAndFlag if(compactlen == COMPACT_LEN_IPV4) { addrstring.append(&compact[0], &compact[compactlen]); flagstring += (*itr)->isSeeder() ? 0x02 : 0x00; + } else if(compactlen == COMPACT_LEN_IPV6) { + addrstring6.append(&compact[0], &compact[compactlen]); + flagstring6 += (*itr)->isSeeder() ? 0x02 : 0x00; } } - return std::pair<std::string, std::string>(addrstring, flagstring); + return std::make_pair(std::make_pair(addrstring, flagstring), + std::make_pair(addrstring6, flagstring6)); } std::string UTPexExtensionMessage::toString() const @@ -172,6 +193,16 @@ UTPexExtensionMessage::create(const unsigned char* data, size_t len) bittorrent::extractPeer (dropped, AF_INET, std::back_inserter(msg->droppedPeers_)); } + const String* added6 = asString(dict->get("added6")); + if(added6) { + bittorrent::extractPeer + (added6, AF_INET6, std::back_inserter(msg->freshPeers_)); + } + const String* dropped6 = asString(dict->get("dropped6")); + if(dropped6) { + bittorrent::extractPeer + (dropped6, AF_INET6, std::back_inserter(msg->droppedPeers_)); + } } return msg; } diff --git a/src/UTPexExtensionMessage.h b/src/UTPexExtensionMessage.h index 74b5f4fb..8c554b4c 100644 --- a/src/UTPexExtensionMessage.h +++ b/src/UTPexExtensionMessage.h @@ -65,7 +65,9 @@ private: size_t maxDroppedPeer_; - std::pair<std::string, std::string> + + std::pair<std::pair<std::string, std::string>, + std::pair<std::string, std::string> > createCompactPeerListAndFlag(const std::vector<SharedHandle<Peer> >& peers); public: |
