diff --git a/include/libtorrent/Makefile.am b/include/libtorrent/Makefile.am index 139458405..7f0df9b52 100644 --- a/include/libtorrent/Makefile.am +++ b/include/libtorrent/Makefile.am @@ -194,6 +194,7 @@ nobase_include_HEADERS = \ kademlia/direct_request.hpp \ kademlia/dos_blocker.hpp \ kademlia/find_data.hpp \ + kademlia/io.hpp \ kademlia/put_data.hpp \ kademlia/msg.hpp \ kademlia/node.hpp \ diff --git a/include/libtorrent/kademlia/io.hpp b/include/libtorrent/kademlia/io.hpp new file mode 100644 index 000000000..c9fda54d3 --- /dev/null +++ b/include/libtorrent/kademlia/io.hpp @@ -0,0 +1,64 @@ +/* + +Copyright (c) 2006-2016, Arvid Norberg, Steven Siloti +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +* Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in +the documentation and/or other materials provided with the distribution. +* Neither the name of the author nor the names of its +contributors may be used to endorse or promote products derived +from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +*/ + +#ifndef KADEMLIA_IO_HPP +#define KADEMLIA_IO_HPP + +#include "libtorrent/kademlia/node_id.hpp" +#include "libtorrent/socket_io.hpp" + +namespace libtorrent { namespace dht { + + struct node_endpoint + { + node_id id; + udp::endpoint ep; + }; + + template + node_endpoint read_node_endpoint(udp protocol, InIt&& in) + { + node_endpoint ep; + std::copy(in, in + 20, ep.id.begin()); + in += 20; +#if TORRENT_USE_IPV6 + if (protocol == udp::v6()) + ep.ep = detail::read_v6_endpoint(in); + else +#endif + ep.ep = detail::read_v4_endpoint(in); + return ep; + } + +}} + +#endif diff --git a/src/kademlia/node.cpp b/src/kademlia/node.cpp index 6075ffe88..9936da3a5 100644 --- a/src/kademlia/node.cpp +++ b/src/kademlia/node.cpp @@ -55,6 +55,7 @@ POSSIBILITY OF SUCH DAMAGE. #include "libtorrent/kademlia/node.hpp" #include "libtorrent/kademlia/dht_observer.hpp" #include "libtorrent/kademlia/direct_request.hpp" +#include "libtorrent/kademlia/io.hpp" #include "libtorrent/kademlia/refresh.hpp" #include "libtorrent/kademlia/get_peers.hpp" @@ -609,17 +610,8 @@ struct ping_observer : observer while (end - nodes >= 20 + protocol_size + 2) { - node_id id; - std::copy(nodes, nodes + 20, id.begin()); - nodes += 20; - udp::endpoint ep; -#if TORRENT_USE_IPV6 - if (protocol == udp::v6()) - ep = detail::read_v6_endpoint(nodes); - else -#endif - ep = detail::read_v4_endpoint(nodes); - algorithm()->get_node().m_table.heard_about(id, ep); + node_endpoint nep = read_node_endpoint(protocol, nodes); + algorithm()->get_node().m_table.heard_about(nep.id, nep.ep); } } } diff --git a/src/kademlia/traversal_algorithm.cpp b/src/kademlia/traversal_algorithm.cpp index 8dfd2f4d0..e84be1000 100644 --- a/src/kademlia/traversal_algorithm.cpp +++ b/src/kademlia/traversal_algorithm.cpp @@ -34,6 +34,7 @@ POSSIBILITY OF SUCH DAMAGE. #include #include #include // for dht_logger +#include #include #include // for read_*_endpoint #include // for dht_lookup @@ -601,17 +602,8 @@ void traversal_observer::reply(msg const& m) while (end - nodes >= 20 + protocol_size + 2) { - node_id id; - std::copy(nodes, nodes + 20, id.begin()); - nodes += 20; - udp::endpoint ep; -#if TORRENT_USE_IPV6 - if (protocol == udp::v6()) - ep = detail::read_v6_endpoint(nodes); - else -#endif - ep = detail::read_v4_endpoint(nodes); - algorithm()->traverse(id, ep); + node_endpoint nep = read_node_endpoint(protocol, nodes); + algorithm()->traverse(nep.id, nep.ep); } }