976{
977
978
979 std::vector<BonjourReply> replies;
980
981 const auto reply_callback = [&rpls = replies](BonjourReply&& reply)
982 {
983 if (std::find(rpls.begin(), rpls.end(), reply) == rpls.end())
984 rpls.push_back(reply);
985 };
986
987 std::shared_ptr< boost::asio::io_context > io_service(new boost::asio::io_context);
988 std::vector<ResolveSocket*> sockets;
989
990
991 std::vector<boost::asio::ip::address> interfaces;
992 asio::ip::udp::resolver resolver(*io_service);
993 boost::system::error_code ec;
994
995 auto results = resolver.resolve(udp::v4(), asio::ip::host_name(), "", ec);
996 if (!ec) {
997 for (auto const& r : results) {
998 auto const addr = r.endpoint().address();
999 if (addr.is_loopback()) continue;
1000 interfaces.emplace_back(addr);
1001 }
1002
1003
1004 for (const auto& intrfc : interfaces)
1006 } else {
1007 BOOST_LOG_TRIVIAL(info) << "Failed to resolve ipv4 interfaces: " << ec.message();
1008 }
1009 if (sockets.empty())
1011
1012
1013 interfaces.clear();
1014 results = resolver.resolve(udp::v6(), asio::ip::host_name(), "", ec);
1015 if (!ec) {
1016 for (auto const& r : results) {
1017 auto const addr = r.endpoint().address();
1018 if (addr.is_loopback()) continue;
1019 interfaces.emplace_back(addr);
1020 }
1021
1022
1023 for (const auto& intrfc : interfaces)
1025 if (interfaces.empty())
1027 } else {
1028 BOOST_LOG_TRIVIAL(info) << "Failed to resolve ipv6 interfaces: " << ec.message();
1029 }
1030
1031 try {
1032
1033 for (auto * socket : sockets)
1034 socket->send();
1035
1036
1037 asio::steady_timer timer(*io_service);
1039 std::function<void(const error_code&)> timer_handler = [&](const error_code& error) {
1040 int replies_count = replies.size();
1041
1042 if (
retries == 0 || error || replies_count > 0) {
1043
1044 io_service->stop();
1047 }
1048
1049 } else {
1051 timer.expires_after(std::chrono::seconds(
timeout));
1052 timer.async_wait(timer_handler);
1053
1054 for (auto * socket : sockets)
1055 socket->send();
1056 }
1057 };
1058
1059 timer.expires_after(std::chrono::seconds(
timeout));
1060 timer.async_wait(timer_handler);
1061
1062 io_service->run();
1063 }
1064 catch (std::exception& e) {
1065 BOOST_LOG_TRIVIAL(error) << e.what();
1066 }
1067}
Bonjour::ResolveFn resolvefn
Definition Bonjour.cpp:870
std::string hostname
Definition Bonjour.cpp:862