diff --git a/examples/Jamfile b/examples/Jamfile index 0a6d53f5d..339569c97 100644 --- a/examples/Jamfile +++ b/examples/Jamfile @@ -27,4 +27,5 @@ exe client_test : client_test.cpp exe simple_client : simple_client.cpp ; exe dump_torrent : dump_torrent.cpp ; exe make_torrent : make_torrent.cpp ; +exe enum_if : enum_if.cpp ; diff --git a/examples/enum_if.cpp b/examples/enum_if.cpp new file mode 100644 index 000000000..79c0a7252 --- /dev/null +++ b/examples/enum_if.cpp @@ -0,0 +1,24 @@ +#include +#include +#include +#include + +using namespace libtorrent; + +int main() +{ + io_service ios; + asio::error_code ec; + std::vector
const& net = enum_net_interfaces(ios, ec); + + for (std::vector
::const_iterator i = net.begin() + , end(net.end()); i != end; ++i) + { + std::cout << *i << " "; + if (is_multicast(*i)) std::cout << "multicast "; + if (is_local(*i)) std::cout << "local "; + if (is_loopback(*i)) std::cout << "loopback "; + std::cout << std::endl; + } +} + diff --git a/include/libtorrent/broadcast_socket.hpp b/include/libtorrent/broadcast_socket.hpp index 23507e402..23be67b0d 100644 --- a/include/libtorrent/broadcast_socket.hpp +++ b/include/libtorrent/broadcast_socket.hpp @@ -42,6 +42,9 @@ namespace libtorrent { bool is_local(address const& a); + bool is_loopback(address const& addr); + bool is_multicast(address const& addr); + address_v4 guess_local_address(asio::io_service&); typedef boost::function(ifr); if (item.ifr_addr.sa_family == AF_INET) { - ret.push_back(address::from_string( - inet_ntoa(((sockaddr_in const*)&item.ifr_addr)->sin_addr))); + typedef asio::ip::address_v4::bytes_type bytes_t; + bytes_t b; + memcpy(&b[0], &((sockaddr_in const*)&item.ifr_addr)->sin_addr, b.size()); + ret.push_back(address_v4(b)); + } + else if (item.ifr_addr.sa_family == AF_INET6) + { + typedef asio::ip::address_v6::bytes_type bytes_t; + bytes_t b; + memcpy(&b[0], &((sockaddr_in6 const*)&item.ifr_addr)->sin6_addr, b.size()); + ret.push_back(address_v6(b)); } #if defined __MACH__ || defined(__FreeBSD__)