make connection_tester bind local sockets to different loopback IPs
This commit is contained in:
parent
1adc9dde8e
commit
addbed9674
|
@ -57,6 +57,14 @@ void generate_block(boost::uint32_t* buffer, int piece, int start, int length)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// in order to circumvent the restricton of only
|
||||||
|
// one connection per IP that most clients implement
|
||||||
|
// all sockets created by this tester are bound to
|
||||||
|
// uniqe local IPs in the range (127.0.0.1 - 127.255.255.255)
|
||||||
|
// it's only enabled if the target is also on the loopback
|
||||||
|
int local_if_counter = 0;
|
||||||
|
bool local_bind = false;
|
||||||
|
|
||||||
struct peer_conn
|
struct peer_conn
|
||||||
{
|
{
|
||||||
peer_conn(io_service& ios, int num_pieces, int blocks_pp, tcp::endpoint const& ep
|
peer_conn(io_service& ios, int num_pieces, int blocks_pp, tcp::endpoint const& ep
|
||||||
|
@ -75,6 +83,27 @@ struct peer_conn
|
||||||
, start_time(time_now_hires())
|
, start_time(time_now_hires())
|
||||||
{
|
{
|
||||||
pieces.reserve(num_pieces);
|
pieces.reserve(num_pieces);
|
||||||
|
if (local_bind)
|
||||||
|
{
|
||||||
|
error_code ec;
|
||||||
|
s.open(ep.protocol(), ec);
|
||||||
|
if (ec)
|
||||||
|
{
|
||||||
|
close("ERROR OPEN: %s", ec);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
tcp::endpoint bind_if(address_v4(
|
||||||
|
(127 << 24)
|
||||||
|
+ ((local_if_counter / 255) << 16)
|
||||||
|
+ ((local_if_counter % 255) + 1)), 0);
|
||||||
|
++local_if_counter;
|
||||||
|
s.bind(bind_if, ec);
|
||||||
|
if (ec)
|
||||||
|
{
|
||||||
|
close("ERROR BIND: %s", ec);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
s.async_connect(ep, boost::bind(&peer_conn::on_connect, this, _1));
|
s.async_connect(ep, boost::bind(&peer_conn::on_connect, this, _1));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -227,6 +256,7 @@ struct peer_conn
|
||||||
char tmp[1024];
|
char tmp[1024];
|
||||||
snprintf(tmp, sizeof(tmp), fmt, ec.message().c_str());
|
snprintf(tmp, sizeof(tmp), fmt, ec.message().c_str());
|
||||||
int time = total_milliseconds(end_time - start_time);
|
int time = total_milliseconds(end_time - start_time);
|
||||||
|
if (time == 0) time = 1;
|
||||||
float up = (boost::int64_t(blocks_sent) * 0x4000) / time / 1000.f;
|
float up = (boost::int64_t(blocks_sent) * 0x4000) / time / 1000.f;
|
||||||
float down = (boost::int64_t(blocks_received) * 0x4000) / time / 1000.f;
|
float down = (boost::int64_t(blocks_received) * 0x4000) / time / 1000.f;
|
||||||
printf("%s sent: %d received: %d duration: %d ms up: %.1fMB/s down: %.1fMB/s\n"
|
printf("%s sent: %d received: %d duration: %d ms up: %.1fMB/s down: %.1fMB/s\n"
|
||||||
|
@ -458,6 +488,12 @@ int main(int argc, char* argv[])
|
||||||
int port = atoi(argv[4]);
|
int port = atoi(argv[4]);
|
||||||
tcp::endpoint ep(addr, port);
|
tcp::endpoint ep(addr, port);
|
||||||
|
|
||||||
|
unsigned long ip = addr.to_ulong();
|
||||||
|
if ((ip & 0xff000000) == 0x7f000000)
|
||||||
|
{
|
||||||
|
local_bind = true;
|
||||||
|
}
|
||||||
|
|
||||||
torrent_info ti(argv[5], ec);
|
torrent_info ti(argv[5], ec);
|
||||||
if (ec)
|
if (ec)
|
||||||
{
|
{
|
||||||
|
@ -497,6 +533,7 @@ int main(int argc, char* argv[])
|
||||||
{
|
{
|
||||||
peer_conn* p = *i;
|
peer_conn* p = *i;
|
||||||
int time = total_milliseconds(p->end_time - p->start_time);
|
int time = total_milliseconds(p->end_time - p->start_time);
|
||||||
|
if (time == 0) time = 1;
|
||||||
up += (boost::int64_t(p->blocks_sent) * 0x4000) / time / 1000.f;
|
up += (boost::int64_t(p->blocks_sent) * 0x4000) / time / 1000.f;
|
||||||
down += (boost::int64_t(p->blocks_received) * 0x4000) / time / 1000.f;
|
down += (boost::int64_t(p->blocks_received) * 0x4000) / time / 1000.f;
|
||||||
delete p;
|
delete p;
|
||||||
|
|
Loading…
Reference in New Issue