added alert for when the client's external IP is received
This commit is contained in:
parent
ffecb32b81
commit
45a7329d5c
|
@ -3344,6 +3344,24 @@ alerts that are generated for a specific torrent are derived from::
|
||||||
|
|
||||||
The specific alerts, that all derives from ``alert``, are:
|
The specific alerts, that all derives from ``alert``, are:
|
||||||
|
|
||||||
|
external_ip_alert
|
||||||
|
-----------------
|
||||||
|
|
||||||
|
Whenever libtorrent learns about the machines external IP, this alert is
|
||||||
|
generated. The external IP address can be acquired from the tracker (if it
|
||||||
|
supports that) or from peers that supports the extension protocol.
|
||||||
|
The address can be accessed through the ``external_address`` member.
|
||||||
|
This alert is generated as severity level ``info``.
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
struct external_ip_alert: alert
|
||||||
|
{
|
||||||
|
external_ip_alert(address const& ip, const std::string& msg);
|
||||||
|
address external_address;
|
||||||
|
virtual std::auto_ptr<alert> clone() const;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
listen_failed_alert
|
listen_failed_alert
|
||||||
-------------------
|
-------------------
|
||||||
|
|
|
@ -379,6 +379,21 @@ namespace libtorrent
|
||||||
{ return std::auto_ptr<alert>(new udp_error_alert(*this)); }
|
{ return std::auto_ptr<alert>(new udp_error_alert(*this)); }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct TORRENT_EXPORT external_ip_alert: alert
|
||||||
|
{
|
||||||
|
external_ip_alert(
|
||||||
|
address const& ip
|
||||||
|
, std::string const& msg)
|
||||||
|
: alert(alert::info, msg)
|
||||||
|
, external_address(ip)
|
||||||
|
{}
|
||||||
|
|
||||||
|
address external_address;
|
||||||
|
|
||||||
|
virtual std::auto_ptr<alert> clone() const
|
||||||
|
{ return std::auto_ptr<alert>(new external_ip_alert(*this)); }
|
||||||
|
};
|
||||||
|
|
||||||
struct TORRENT_EXPORT listen_failed_alert: alert
|
struct TORRENT_EXPORT listen_failed_alert: alert
|
||||||
{
|
{
|
||||||
listen_failed_alert(
|
listen_failed_alert(
|
||||||
|
|
|
@ -320,7 +320,8 @@ namespace libtorrent
|
||||||
void free_buffer(char* buf, int size);
|
void free_buffer(char* buf, int size);
|
||||||
void free_disk_buffer(char* buf);
|
void free_disk_buffer(char* buf);
|
||||||
|
|
||||||
address m_external_address;
|
void set_external_address(address const& ip);
|
||||||
|
address const& external_address() const { return m_external_address; }
|
||||||
|
|
||||||
// private:
|
// private:
|
||||||
|
|
||||||
|
@ -554,7 +555,9 @@ namespace libtorrent
|
||||||
public:
|
public:
|
||||||
boost::shared_ptr<logger> m_logger;
|
boost::shared_ptr<logger> m_logger;
|
||||||
private:
|
private:
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
address m_external_address;
|
||||||
|
|
||||||
#ifndef TORRENT_DISABLE_EXTENSIONS
|
#ifndef TORRENT_DISABLE_EXTENSIONS
|
||||||
typedef std::list<boost::function<boost::shared_ptr<
|
typedef std::list<boost::function<boost::shared_ptr<
|
||||||
|
|
|
@ -97,6 +97,15 @@ namespace libtorrent
|
||||||
|
|
||||||
typedef asio::basic_deadline_timer<libtorrent::ptime> deadline_timer;
|
typedef asio::basic_deadline_timer<libtorrent::ptime> deadline_timer;
|
||||||
|
|
||||||
|
inline std::ostream& print_address(std::ostream& os, address const& addr)
|
||||||
|
{
|
||||||
|
asio::error_code ec;
|
||||||
|
std::string a = addr.to_string(ec);
|
||||||
|
if (ec) return os;
|
||||||
|
os << a;
|
||||||
|
return os;
|
||||||
|
}
|
||||||
|
|
||||||
inline std::ostream& print_endpoint(std::ostream& os, tcp::endpoint const& ep)
|
inline std::ostream& print_endpoint(std::ostream& os, tcp::endpoint const& ep)
|
||||||
{
|
{
|
||||||
address const& addr = ep.address();
|
address const& addr = ep.address();
|
||||||
|
|
|
@ -310,7 +310,7 @@ namespace libtorrent
|
||||||
virtual void tracker_response(
|
virtual void tracker_response(
|
||||||
tracker_request const& r
|
tracker_request const& r
|
||||||
, std::vector<peer_entry>& e, int interval
|
, std::vector<peer_entry>& e, int interval
|
||||||
, int complete, int incomplete);
|
, int complete, int incomplete, address const& external_ip);
|
||||||
virtual void tracker_request_timed_out(
|
virtual void tracker_request_timed_out(
|
||||||
tracker_request const& r);
|
tracker_request const& r);
|
||||||
virtual void tracker_request_error(tracker_request const& r
|
virtual void tracker_request_error(tracker_request const& r
|
||||||
|
|
|
@ -126,7 +126,8 @@ namespace libtorrent
|
||||||
, std::vector<peer_entry>& peers
|
, std::vector<peer_entry>& peers
|
||||||
, int interval
|
, int interval
|
||||||
, int complete
|
, int complete
|
||||||
, int incomplete) = 0;
|
, int incomplete
|
||||||
|
, address const& external_ip) = 0;
|
||||||
virtual void tracker_request_timed_out(
|
virtual void tracker_request_timed_out(
|
||||||
tracker_request const&) = 0;
|
tracker_request const&) = 0;
|
||||||
virtual void tracker_request_error(
|
virtual void tracker_request_error(
|
||||||
|
|
|
@ -1296,13 +1296,13 @@ namespace libtorrent
|
||||||
{
|
{
|
||||||
address_v4::bytes_type bytes;
|
address_v4::bytes_type bytes;
|
||||||
std::copy(my_ip.begin(), my_ip.end(), bytes.begin());
|
std::copy(my_ip.begin(), my_ip.end(), bytes.begin());
|
||||||
m_ses.m_external_address = address_v4(bytes);
|
m_ses.set_external_address(address_v4(bytes));
|
||||||
}
|
}
|
||||||
else if (my_ip.size() == address_v6::bytes_type::static_size)
|
else if (my_ip.size() == address_v6::bytes_type::static_size)
|
||||||
{
|
{
|
||||||
address_v6::bytes_type bytes;
|
address_v6::bytes_type bytes;
|
||||||
std::copy(my_ip.begin(), my_ip.end(), bytes.begin());
|
std::copy(my_ip.begin(), my_ip.end(), bytes.begin());
|
||||||
m_ses.m_external_address = address_v6(bytes);
|
m_ses.set_external_address(address_v6(bytes));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -59,6 +59,7 @@ POSSIBILITY OF SUCH DAMAGE.
|
||||||
#include "libtorrent/bencode.hpp"
|
#include "libtorrent/bencode.hpp"
|
||||||
#include "libtorrent/torrent.hpp"
|
#include "libtorrent/torrent.hpp"
|
||||||
#include "libtorrent/io.hpp"
|
#include "libtorrent/io.hpp"
|
||||||
|
#include "libtorrent/socket.hpp"
|
||||||
|
|
||||||
using namespace libtorrent;
|
using namespace libtorrent;
|
||||||
using boost::bind;
|
using boost::bind;
|
||||||
|
@ -406,6 +407,18 @@ namespace libtorrent
|
||||||
// look for optional scrape info
|
// look for optional scrape info
|
||||||
int complete = -1;
|
int complete = -1;
|
||||||
int incomplete = -1;
|
int incomplete = -1;
|
||||||
|
address external_ip;
|
||||||
|
|
||||||
|
entry const* ip_ent = e.find_key("external ip");
|
||||||
|
if (ip_ent && ip_ent->type() == entry::string_t)
|
||||||
|
{
|
||||||
|
std::string const& ip = ip_ent->string();
|
||||||
|
char const* p = &ip[0];
|
||||||
|
if (ip.size() == address_v4::bytes_type::static_size)
|
||||||
|
external_ip = detail::read_v4_address(p);
|
||||||
|
else if (ip.size() == address_v6::bytes_type::static_size)
|
||||||
|
external_ip = detail::read_v6_address(p);
|
||||||
|
}
|
||||||
|
|
||||||
entry const* complete_ent = e.find_key("complete");
|
entry const* complete_ent = e.find_key("complete");
|
||||||
if (complete_ent && complete_ent->type() == entry::int_t)
|
if (complete_ent && complete_ent->type() == entry::int_t)
|
||||||
|
@ -416,7 +429,7 @@ namespace libtorrent
|
||||||
incomplete = incomplete_ent->integer();
|
incomplete = incomplete_ent->integer();
|
||||||
|
|
||||||
cb->tracker_response(tracker_req(), peer_list, interval->integer(), complete
|
cb->tracker_response(tracker_req(), peer_list, interval->integer(), complete
|
||||||
, incomplete);
|
, incomplete, external_ip);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -459,7 +459,7 @@ namespace libtorrent
|
||||||
int min_reconnect_time = m_torrent->settings().min_reconnect_time;
|
int min_reconnect_time = m_torrent->settings().min_reconnect_time;
|
||||||
int min_cidr_distance = (std::numeric_limits<int>::max)();
|
int min_cidr_distance = (std::numeric_limits<int>::max)();
|
||||||
bool finished = m_torrent->is_finished();
|
bool finished = m_torrent->is_finished();
|
||||||
address external_ip = m_torrent->session().m_external_address;
|
address external_ip = m_torrent->session().external_address();
|
||||||
|
|
||||||
if (external_ip == address())
|
if (external_ip == address())
|
||||||
{
|
{
|
||||||
|
|
|
@ -2008,6 +2008,22 @@ namespace aux {
|
||||||
m_upnp = 0;
|
m_upnp = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void session_impl::set_external_address(address const& ip)
|
||||||
|
{
|
||||||
|
TORRENT_ASSERT(ip != address());
|
||||||
|
|
||||||
|
if (m_external_address == ip) return;
|
||||||
|
|
||||||
|
m_external_address = ip;
|
||||||
|
if (m_alerts.should_post(alert::info))
|
||||||
|
{
|
||||||
|
std::stringstream msg;
|
||||||
|
msg << "external address is '";
|
||||||
|
print_address(msg, ip) << "'";
|
||||||
|
m_alerts.post_alert(external_ip_alert(ip, msg.str()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void session_impl::free_disk_buffer(char* buf)
|
void session_impl::free_disk_buffer(char* buf)
|
||||||
{
|
{
|
||||||
m_disk_thread.free_buffer(buf);
|
m_disk_thread.free_buffer(buf);
|
||||||
|
|
|
@ -803,13 +803,17 @@ namespace libtorrent
|
||||||
, std::vector<peer_entry>& peer_list
|
, std::vector<peer_entry>& peer_list
|
||||||
, int interval
|
, int interval
|
||||||
, int complete
|
, int complete
|
||||||
, int incomplete)
|
, int incomplete
|
||||||
|
, address const& external_ip)
|
||||||
{
|
{
|
||||||
session_impl::mutex_t::scoped_lock l(m_ses.m_mutex);
|
session_impl::mutex_t::scoped_lock l(m_ses.m_mutex);
|
||||||
|
|
||||||
INVARIANT_CHECK;
|
INVARIANT_CHECK;
|
||||||
TORRENT_ASSERT(r.kind == tracker_request::announce_request);
|
TORRENT_ASSERT(r.kind == tracker_request::announce_request);
|
||||||
|
|
||||||
|
if (external_ip != address())
|
||||||
|
m_ses.set_external_address(external_ip);
|
||||||
|
|
||||||
m_failed_trackers = 0;
|
m_failed_trackers = 0;
|
||||||
// announce intervals less than 5 minutes
|
// announce intervals less than 5 minutes
|
||||||
// are insane.
|
// are insane.
|
||||||
|
@ -841,6 +845,7 @@ namespace libtorrent
|
||||||
if (!i->pid.is_all_zeros()) s << " " << i->pid << " " << identify_client(i->pid);
|
if (!i->pid.is_all_zeros()) s << " " << i->pid << " " << identify_client(i->pid);
|
||||||
s << "\n";
|
s << "\n";
|
||||||
}
|
}
|
||||||
|
s << "external ip: " << external_ip << "\n";
|
||||||
debug_log(s.str());
|
debug_log(s.str());
|
||||||
#endif
|
#endif
|
||||||
// for each of the peers we got from the tracker
|
// for each of the peers we got from the tracker
|
||||||
|
|
|
@ -394,7 +394,7 @@ namespace libtorrent
|
||||||
}
|
}
|
||||||
|
|
||||||
cb->tracker_response(tracker_req(), peer_list, interval
|
cb->tracker_response(tracker_req(), peer_list, interval
|
||||||
, complete, incomplete);
|
, complete, incomplete, address());
|
||||||
|
|
||||||
m_man.remove_request(this);
|
m_man.remove_request(this);
|
||||||
close();
|
close();
|
||||||
|
|
Loading…
Reference in New Issue