954{
955
956
957 std::vector<BonjourReply> replies;
958
959 const auto reply_callback = [&rpls = replies](BonjourReply&& reply)
960 {
961 if (std::find(rpls.begin(), rpls.end(), reply) == rpls.end())
962 rpls.push_back(reply);
963 };
964
965 std::shared_ptr< boost::asio::io_service > io_service(new boost::asio::io_service);
966 std::vector<ResolveSocket*> sockets;
967
968
969 std::vector<boost::asio::ip::address> interfaces;
970 asio::ip::udp::resolver resolver(*io_service);
971 boost::system::error_code ec;
972
973 auto results = resolver.resolve(udp::v4(), asio::ip::host_name(), "", ec);
974 if (!ec) {
975 for (auto const& r : results) {
976 auto const addr = r.endpoint().address();
977 if (addr.is_loopback()) continue;
978 interfaces.emplace_back(addr);
979 }
980
981
982 for (const auto& intrfc : interfaces)
983 sockets.emplace_back(new ResolveSocket(
hostname, reply_callback, BonjourRequest::MCAST_IP4, intrfc, io_service));
984 } else {
985 BOOST_LOG_TRIVIAL(info) << "Failed to resolve ipv4 interfaces: " << ec.message();
986 }
987 if (sockets.empty())
989
990
991 interfaces.clear();
992 results = resolver.resolve(udp::v6(), asio::ip::host_name(), "", ec);
993 if (!ec) {
994 for (auto const& r : results) {
995 auto const addr = r.endpoint().address();
996 if (addr.is_loopback()) continue;
997 interfaces.emplace_back(addr);
998 }
999
1000
1001 for (const auto& intrfc : interfaces)
1002 sockets.emplace_back(new ResolveSocket(
hostname, reply_callback, BonjourRequest::MCAST_IP6, intrfc, io_service));
1003 if (interfaces.empty())
1005 } else {
1006 BOOST_LOG_TRIVIAL(info) << "Failed to resolve ipv6 interfaces: " << ec.message();
1007 }
1008
1009 try {
1010
1011 for (auto * socket : sockets)
1012 socket->send();
1013
1014
1015 asio::deadline_timer timer(*io_service);
1017 std::function<
void(
const error_code&)> timer_handler = [&](
const error_code&
error) {
1018 int replies_count = replies.size();
1019
1021
1022 io_service->stop();
1025 }
1026
1027 } else {
1029 timer.expires_from_now(boost::posix_time::seconds(
timeout));
1030 timer.async_wait(timer_handler);
1031
1032 for (auto * socket : sockets)
1033 socket->send();
1034 }
1035 };
1036
1037 timer.expires_from_now(boost::posix_time::seconds(
timeout));
1038 timer.async_wait(timer_handler);
1039
1040 io_service->run();
1041 }
1042 catch (std::exception& e) {
1043 BOOST_LOG_TRIVIAL(
error) << e.what();
1044 }
1045}
Bonjour::ResolveFn resolvefn
Definition Bonjour.cpp:848
std::string hostname
Definition Bonjour.cpp:840