merged udp tracker fix from RC_0_16

This commit is contained in:
Arvid Norberg 2012-10-01 00:13:58 +00:00
parent d181b2e057
commit acdb647eca
5 changed files with 46 additions and 10 deletions

View File

@ -5,6 +5,8 @@
* fix uTP edge case where udp socket buffer fills up * fix uTP edge case where udp socket buffer fills up
* fix nagle implementation in uTP * fix nagle implementation in uTP
* fix UDP trackers trying all endpoints behind the hostname
0.16.4 release 0.16.4 release
* raise the default number of torrents allowed to announce to trackers to 1600 * raise the default number of torrents allowed to announce to trackers to 1600

View File

@ -225,7 +225,7 @@ namespace libtorrent
, io_service& ios , io_service& ios
, boost::weak_ptr<request_callback> r); , boost::weak_ptr<request_callback> r);
boost::shared_ptr<request_callback> requester(); boost::shared_ptr<request_callback> requester() const;
virtual ~tracker_connection() {} virtual ~tracker_connection() {}
tracker_request const& tracker_req() const { return m_req; } tracker_request const& tracker_req() const { return m_req; }

View File

@ -108,12 +108,18 @@ namespace libtorrent
bool on_announce_response(char const* buf, int size); bool on_announce_response(char const* buf, int size);
bool on_scrape_response(char const* buf, int size); bool on_scrape_response(char const* buf, int size);
// wraps tracker_connection::fail
void fail(error_code const& ec, int code = -1
, char const* msg = "", int interval = 0, int min_interval = 0);
void send_udp_connect(); void send_udp_connect();
void send_udp_announce(); void send_udp_announce();
void send_udp_scrape(); void send_udp_scrape();
virtual void on_timeout(error_code const& ec); virtual void on_timeout(error_code const& ec);
udp::endpoint pick_target_endpoint() const;
// tracker_manager& m_man; // tracker_manager& m_man;
bool m_abort; bool m_abort;

View File

@ -156,7 +156,7 @@ namespace libtorrent
, m_req(req) , m_req(req)
{} {}
boost::shared_ptr<request_callback> tracker_connection::requester() boost::shared_ptr<request_callback> tracker_connection::requester() const
{ {
return m_requester.lock(); return m_requester.lock();
} }

View File

@ -132,6 +132,26 @@ namespace libtorrent
, settings.tracker_receive_timeout); , settings.tracker_receive_timeout);
} }
void udp_tracker_connection::fail(error_code const& ec, int code
, char const* msg, int interval, int min_interval)
{
// m_target failed. remove it from the endpoint list
std::list<tcp::endpoint>::iterator i = std::find(m_endpoints.begin()
, m_endpoints.end(), tcp::endpoint(m_target.address(), m_target.port()));
if (i != m_endpoints.end()) m_endpoints.erase(i);
// if that was the last one, fail the whole announce
if (m_endpoints.empty())
tracker_connection::fail(ec, code, msg, interval, min_interval);
// pick another target endpoint and try again
m_target = pick_target_endpoint();
m_ses.m_io_service.post(boost::bind(
&udp_tracker_connection::start_announce, self()));
}
void udp_tracker_connection::name_lookup(error_code const& error void udp_tracker_connection::name_lookup(error_code const& error
, tcp::resolver::iterator i) , tcp::resolver::iterator i)
{ {
@ -191,8 +211,17 @@ namespace libtorrent
return; return;
} }
std::list<tcp::endpoint>::iterator iter = m_endpoints.begin(); m_target = pick_target_endpoint();
m_target = udp::endpoint(iter->address(), iter->port());
if (cb) cb->m_tracker_address = tcp::endpoint(m_target.address(), m_target.port());
start_announce();
}
udp::endpoint udp_tracker_connection::pick_target_endpoint() const
{
std::list<tcp::endpoint>::const_iterator iter = m_endpoints.begin();
udp::endpoint target = udp::endpoint(iter->address(), iter->port());
if (bind_interface() != address_v4::any()) if (bind_interface() != address_v4::any())
{ {
@ -202,10 +231,11 @@ namespace libtorrent
if (iter == m_endpoints.end()) if (iter == m_endpoints.end())
{ {
TORRENT_ASSERT(m_target.address().is_v4() != bind_interface().is_v4()); TORRENT_ASSERT(target.address().is_v4() != bind_interface().is_v4());
boost::shared_ptr<request_callback> cb = requester();
if (cb) if (cb)
{ {
char const* tracker_address_type = m_target.address().is_v4() ? "IPv4" : "IPv6"; char const* tracker_address_type = target.address().is_v4() ? "IPv4" : "IPv6";
char const* bind_address_type = bind_interface().is_v4() ? "IPv4" : "IPv6"; char const* bind_address_type = bind_interface().is_v4() ? "IPv4" : "IPv6";
char msg[200]; char msg[200];
snprintf(msg, sizeof(msg) snprintf(msg, sizeof(msg)
@ -219,13 +249,11 @@ namespace libtorrent
} }
else else
{ {
m_target = udp::endpoint(iter->address(), iter->port()); target = udp::endpoint(iter->address(), iter->port());
} }
} }
if (cb) cb->m_tracker_address = tcp::endpoint(m_target.address(), m_target.port()); return target;
start_announce();
} }
void udp_tracker_connection::start_announce() void udp_tracker_connection::start_announce()