00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033 #ifndef TORRENT_DISABLE_DHT
00034
00035 #ifndef TORRENT_DHT_TRACKER
00036 #define TORRENT_DHT_TRACKER
00037
00038 #include <fstream>
00039 #include <set>
00040 #include <numeric>
00041 #include <boost/bind.hpp>
00042 #include <boost/date_time/posix_time/posix_time_types.hpp>
00043 #include <boost/date_time/posix_time/ptime.hpp>
00044 #include <boost/ref.hpp>
00045 #include <boost/optional.hpp>
00046 #include <boost/lexical_cast.hpp>
00047 #include <boost/filesystem/operations.hpp>
00048 #include <boost/intrusive_ptr.hpp>
00049 #include <boost/detail/atomic_count.hpp>
00050
00051 #include "libtorrent/kademlia/node.hpp"
00052 #include "libtorrent/kademlia/node_id.hpp"
00053 #include "libtorrent/kademlia/traversal_algorithm.hpp"
00054 #include "libtorrent/kademlia/packet_iterator.hpp"
00055 #include "libtorrent/session_settings.hpp"
00056 #include "libtorrent/session_status.hpp"
00057
00058 namespace libtorrent { namespace dht
00059 {
00060
00061 #ifdef TORRENT_DHT_VERBOSE_LOGGING
00062 TORRENT_DECLARE_LOG(dht_tracker);
00063 #endif
00064
00065 struct dht_tracker;
00066
00067 TORRENT_EXPORT void intrusive_ptr_add_ref(dht_tracker const*);
00068 TORRENT_EXPORT void intrusive_ptr_release(dht_tracker const*);
00069
00070 struct dht_tracker
00071 {
00072 friend void intrusive_ptr_add_ref(dht_tracker const*);
00073 friend void intrusive_ptr_release(dht_tracker const*);
00074 dht_tracker(asio::io_service& ios, dht_settings const& settings
00075 , asio::ip::address listen_interface, entry const& bootstrap);
00076 void stop();
00077
00078 void add_node(udp::endpoint node);
00079 void add_node(std::pair<std::string, int> const& node);
00080 void add_router_node(std::pair<std::string, int> const& node);
00081
00082 void rebind(asio::ip::address listen_interface, int listen_port);
00083
00084 entry state() const;
00085
00086 void announce(sha1_hash const& ih, int listen_port
00087 , boost::function<void(std::vector<tcp::endpoint> const&
00088 , sha1_hash const&)> f);
00089
00090 void dht_status(session_status& s);
00091
00092 private:
00093
00094 boost::intrusive_ptr<dht_tracker> self()
00095 { return boost::intrusive_ptr<dht_tracker>(this); }
00096
00097 void on_name_lookup(asio::error_code const& e
00098 , udp::resolver::iterator host);
00099 void on_router_name_lookup(asio::error_code const& e
00100 , udp::resolver::iterator host);
00101 void connection_timeout(asio::error_code const& e);
00102 void refresh_timeout(asio::error_code const& e);
00103 void tick(asio::error_code const& e);
00104
00105
00106
00107 void on_receive(asio::error_code const& error, size_t bytes_transferred);
00108 void on_bootstrap();
00109 void send_packet(msg const& m);
00110
00111 asio::strand m_strand;
00112 asio::ip::udp::socket m_socket;
00113
00114 node_impl m_dht;
00115
00116
00117
00118 int m_buffer;
00119 std::vector<char> m_in_buf[2];
00120 udp::endpoint m_remote_endpoint[2];
00121 std::vector<char> m_send_buf;
00122
00123 boost::posix_time::ptime m_last_refresh;
00124 deadline_timer m_timer;
00125 deadline_timer m_connection_timer;
00126 deadline_timer m_refresh_timer;
00127 dht_settings const& m_settings;
00128 int m_refresh_bucket;
00129
00130
00131 udp::resolver m_host_resolver;
00132
00133
00134 mutable boost::detail::atomic_count m_refs;
00135
00136 #ifdef TORRENT_DHT_VERBOSE_LOGGING
00137 int m_replies_sent[5];
00138 int m_queries_received[5];
00139 int m_replies_bytes_sent[5];
00140 int m_queries_bytes_received[5];
00141 int m_counter;
00142 int m_announces;
00143 int m_failed_announces;
00144
00145 int m_total_message_input;
00146 int m_ut_message_input;
00147 int m_lt_message_input;
00148 int m_mp_message_input;
00149 int m_gr_message_input;
00150 int m_mo_message_input;
00151
00152 int m_total_in_bytes;
00153 int m_total_out_bytes;
00154
00155 int m_queries_out_bytes;
00156 #endif
00157 };
00158 }}
00159
00160 #endif
00161 #endif