forked from premiere/premiere-libtorrent
fix bug in duplicate-peer resolution. just take the port into account, not the whole IP, because the different ends may have different ideas of what their IP is
This commit is contained in:
parent
6228ef2e85
commit
a4d4b362e6
|
@ -5256,8 +5256,8 @@ namespace libtorrent
|
||||||
INVARIANT_CHECK;
|
INVARIANT_CHECK;
|
||||||
|
|
||||||
#ifdef TORRENT_VERBOSE_LOGGING
|
#ifdef TORRENT_VERBOSE_LOGGING
|
||||||
peer_log("<<< ON_RECEIVE_DATA [ bytes: %d error: %s ]"
|
peer_log("<<< ON_RECEIVE_DATA [ bytes: %d error: %s ]"
|
||||||
, bytes_transferred, error.message().c_str());
|
, bytes_transferred, error.message().c_str());
|
||||||
#endif
|
#endif
|
||||||
#if defined TORRENT_ASIO_DEBUGGING
|
#if defined TORRENT_ASIO_DEBUGGING
|
||||||
complete_async("peer_connection::on_receive_data");
|
complete_async("peer_connection::on_receive_data");
|
||||||
|
|
|
@ -913,7 +913,13 @@ namespace libtorrent
|
||||||
i = *iter;
|
i = *iter;
|
||||||
TORRENT_ASSERT(i->in_use);
|
TORRENT_ASSERT(i->in_use);
|
||||||
TORRENT_ASSERT(i->connection != &c);
|
TORRENT_ASSERT(i->connection != &c);
|
||||||
|
TORRENT_ASSERT(i->address() == c.remote().address());
|
||||||
|
|
||||||
|
#ifdef TORRENT_VERBOSE_LOGGING
|
||||||
|
c.peer_log("*** DUPLICATE PEER [ this: \"%s\" that: \"%s\" ]"
|
||||||
|
, print_address(c.remote().address()).c_str()
|
||||||
|
, print_address(i->address()).c_str());
|
||||||
|
#endif
|
||||||
if (i->banned)
|
if (i->banned)
|
||||||
{
|
{
|
||||||
c.disconnect(errors::peer_banned);
|
c.disconnect(errors::peer_banned);
|
||||||
|
@ -982,16 +988,14 @@ namespace libtorrent
|
||||||
// to be careful to only look at the target end of a
|
// to be careful to only look at the target end of a
|
||||||
// connection for the endpoint.
|
// connection for the endpoint.
|
||||||
|
|
||||||
tcp::endpoint our_ep = outgoing1 ? other_socket->local_endpoint(ec1) : this_socket->local_endpoint(ec1);
|
int our_port = outgoing1 ? other_socket->local_endpoint(ec1).port() : this_socket->local_endpoint(ec1).port();
|
||||||
tcp::endpoint other_ep = outgoing1 ? this_socket->remote_endpoint(ec1) : other_socket->remote_endpoint(ec1);
|
int other_port = outgoing1 ? this_socket->remote_endpoint(ec1).port() : other_socket->remote_endpoint(ec1).port();
|
||||||
|
|
||||||
if (our_ep < other_ep)
|
if (our_port < other_port)
|
||||||
{
|
{
|
||||||
#ifdef TORRENT_VERBOSE_LOGGING
|
#ifdef TORRENT_VERBOSE_LOGGING
|
||||||
c.peer_log("*** DUPLICATE PEER RESOLUTION [ \"%s\" < \"%s\" ]"
|
c.peer_log("*** DUPLICATE PEER RESOLUTION [ \"%d\" < \"%d\" ]", our_port, other_port);
|
||||||
, print_endpoint(our_ep).c_str(), print_endpoint(other_ep).c_str());
|
i->connection->peer_log("*** DUPLICATE PEER RESOLUTION [ \"%d\" < \"%d\" ]", our_port, other_port);
|
||||||
i->connection->peer_log("*** DUPLICATE PEER RESOLUTION [ \"%s\" < \"%s\" ]"
|
|
||||||
, print_endpoint(our_ep).c_str(), print_endpoint(other_ep).c_str());
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// we should keep our outgoing connection
|
// we should keep our outgoing connection
|
||||||
|
@ -1008,10 +1012,8 @@ namespace libtorrent
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
#ifdef TORRENT_VERBOSE_LOGGING
|
#ifdef TORRENT_VERBOSE_LOGGING
|
||||||
c.peer_log("*** DUPLICATE PEER RESOLUTION [ \"%s\" >= \"%s\" ]"
|
c.peer_log("*** DUPLICATE PEER RESOLUTION [ \"%d\" >= \"%d\" ]", our_port, other_port);
|
||||||
, print_endpoint(our_ep).c_str(), print_endpoint(other_ep).c_str());
|
i->connection->peer_log("*** DUPLICATE PEER RESOLUTION [ \"%d\" >= \"%d\" ]", our_port, other_port);
|
||||||
i->connection->peer_log("*** DUPLICATE PEER RESOLUTION [ \"%s\" >= \"%s\" ]"
|
|
||||||
, print_endpoint(our_ep).c_str(), print_endpoint(other_ep).c_str());
|
|
||||||
#endif
|
#endif
|
||||||
// they should keep their outgoing connection
|
// they should keep their outgoing connection
|
||||||
if (outgoing1)
|
if (outgoing1)
|
||||||
|
|
Loading…
Reference in New Issue