1#ifndef SERVICE_DISCOVERY_HPP
2#define SERVICE_DISCOVERY_HPP
6#include <condition_variable>
10#include <nlohmann/json.hpp>
18using json = nlohmann::json;
24 std::map<std::string, uint16_t>
ports;
56 std::chrono::milliseconds timeout =
57 std::chrono::milliseconds::zero()) const;
59 std::chrono::milliseconds timeout = std::chrono::milliseconds{1000})
63 struct InterfaceAddress {
65 unsigned int index{0};
67 std::string broadcast;
70 std::vector<InterfaceAddress> list_broadcast_interfaces()
const;
71 std::optional<ServiceInfo> try_discover(
const std::string &room,
72 std::chrono::milliseconds timeout,
73 bool exact_room)
const;
74 void advertising_loop();
76 uint16_t _discovery_port;
77 mutable std::mutex _mutex;
78 std::condition_variable _cv;
79 std::thread _advertising_thread;
82 bool _advertising{
false};
83 bool _stop_requested{
false};
84 bool _room_reserved{
false};
ServiceDiscovery & operator=(ServiceDiscovery &&)=delete
static constexpr std::chrono::milliseconds DEFAULT_ADVERTISE_INTERVAL
std::map< std::string, ServiceDiscovery::ServiceInfo > list_rooms(std::chrono::milliseconds timeout=std::chrono::milliseconds{1000}) const
void advertise_once(const ServiceInfo &service) const
ServiceDiscovery(uint16_t discovery_port=DEFAULT_DISCOVERY_PORT)
void start_advertising(ServiceInfo &service, std::chrono::milliseconds interval=DEFAULT_ADVERTISE_INTERVAL)
ServiceDiscovery(const ServiceDiscovery &)=delete
ServiceDiscovery(ServiceDiscovery &&)=delete
ServiceDiscovery & operator=(const ServiceDiscovery &)=delete
uint16_t discovery_port() const noexcept
ServiceInfo discover(const std::string &room="", std::chrono::milliseconds timeout=std::chrono::milliseconds::zero()) const
static constexpr uint16_t DEFAULT_DISCOVERY_PORT
bool is_advertising() const noexcept
bool prefer_loopback_for_local_services
static ServiceInfo from_json(const json &payload)
std::map< std::string, uint16_t > ports