Mads
Multi-Agent Distributed System
Loading...
Searching...
No Matches
service_discovery.hpp
Go to the documentation of this file.
1#ifndef SERVICE_DISCOVERY_HPP
2#define SERVICE_DISCOVERY_HPP
3
4#include "mads.hpp"
5#include <chrono>
6#include <condition_variable>
7#include <cstdint>
8#include <map>
9#include <mutex>
10#include <nlohmann/json.hpp>
11#include <optional>
12#include <string>
13#include <thread>
14#include <vector>
15
16namespace Mads {
17
18using json = nlohmann::json;
19
21public:
22 struct ServiceInfo {
23 std::string ip;
24 std::map<std::string, uint16_t> ports;
25 std::string room;
26 std::string hostname;
27 std::string version;
28 bool encrypted{false};
30
31 json to_json() const;
32 static ServiceInfo from_json(const json &payload);
33 };
34
35 static constexpr uint16_t DEFAULT_DISCOVERY_PORT = 39092;
36 static constexpr std::chrono::milliseconds DEFAULT_ADVERTISE_INTERVAL{1000};
37
40
45
46 uint16_t discovery_port() const noexcept;
47 bool is_advertising() const noexcept;
48
49 void advertise_once(const ServiceInfo &service) const;
51 ServiceInfo &service,
52 std::chrono::milliseconds interval = DEFAULT_ADVERTISE_INTERVAL);
54
55 ServiceInfo discover(const std::string &room = "",
56 std::chrono::milliseconds timeout =
57 std::chrono::milliseconds::zero()) const;
58 std::map<std::string, ServiceDiscovery::ServiceInfo> list_rooms(
59 std::chrono::milliseconds timeout = std::chrono::milliseconds{1000})
60 const;
61
62private:
63 struct InterfaceAddress {
64 std::string name;
65 unsigned int index{0};
66 std::string ip;
67 std::string broadcast;
68 };
69
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();
75
76 uint16_t _discovery_port;
77 mutable std::mutex _mutex;
78 std::condition_variable _cv;
79 std::thread _advertising_thread;
80 ServiceInfo _service;
81 std::chrono::milliseconds _interval{DEFAULT_ADVERTISE_INTERVAL};
82 bool _advertising{false};
83 bool _stop_requested{false};
84 bool _room_reserved{false};
85};
86
87} // namespace Mads
88
89#endif
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
Definition agent.hpp:67
nlohmann::json json
static ServiceInfo from_json(const json &payload)
std::map< std::string, uint16_t > ports