support optional LSD IP broadcast

This commit is contained in:
Arvid Norberg
2010-03-26 17:45:16 +00:00
parent c14042b29e
commit c6f57ce5d7
7 changed files with 71 additions and 5 deletions

View File

@@ -187,6 +187,7 @@ namespace libtorrent
, bool loopback)
: m_multicast_endpoint(multicast_endpoint)
, m_on_receive(handler)
, m_ip_broadcast(false)
{
TORRENT_ASSERT(is_multicast(m_multicast_endpoint.address()));
@@ -218,7 +219,22 @@ namespace libtorrent
// , print_address(multicast_endpoint.address()).c_str()
// , ec.message().c_str());
#endif
open_unicast_socket(ios, i->interface_address);
open_unicast_socket(ios, i->interface_address
, i->netmask.is_v4() ? i->netmask.to_v4() : address_v4());
}
}
void broadcast_socket::enable_ip_broadcast(bool e)
{
if (e == m_ip_broadcast) return;
m_ip_broadcast = e;
asio::socket_base::broadcast option(m_ip_broadcast);
for (std::list<socket_entry>::iterator i = m_unicast_sockets.begin()
, end(m_unicast_sockets.end()); i != end; ++i)
{
if (i->socket) continue;
i->socket->set_option(option);
}
}
@@ -246,7 +262,8 @@ namespace libtorrent
, se.remote, bind(&broadcast_socket::on_receive, this, &se, _1, _2));
}
void broadcast_socket::open_unicast_socket(io_service& ios, address const& addr)
void broadcast_socket::open_unicast_socket(io_service& ios, address const& addr
, address_v4 const& mask)
{
using namespace asio::ip::multicast;
error_code ec;
@@ -255,7 +272,7 @@ namespace libtorrent
if (ec) return;
s->bind(udp::endpoint(addr, 0), ec);
if (ec) return;
m_unicast_sockets.push_back(socket_entry(s));
m_unicast_sockets.push_back(socket_entry(s, mask));
socket_entry& se = m_unicast_sockets.back();
s->async_receive_from(asio::buffer(se.buffer, sizeof(se.buffer))
, se.remote, bind(&broadcast_socket::on_receive, this, &se, _1, _2));
@@ -289,6 +306,9 @@ namespace libtorrent
if (!i->socket) continue;
error_code e;
i->socket->send_to(asio::buffer(buffer, size), m_multicast_endpoint, 0, e);
if (m_ip_broadcast && i->socket->local_endpoint(e).address().is_v4())
i->socket->send_to(asio::buffer(buffer, size)
, udp::endpoint(i->broadcast_address(), m_multicast_endpoint.port()), 0, e);
#ifndef NDEBUG
// extern std::string print_address(address const& addr);
// extern std::string print_endpoint(udp::endpoint const& ep);