|
|
@@ -0,0 +1,71 @@
|
|
|
+#include "Dns/MulticastDnsClient.h"
|
|
|
+#include <asio.hpp>
|
|
|
+#include <Logging.h>
|
|
|
+#include <functional>
|
|
|
+#include <unistd.h>
|
|
|
+
|
|
|
+
|
|
|
+namespace Network {
|
|
|
+namespace Test {
|
|
|
+
|
|
|
+class Test
|
|
|
+{
|
|
|
+public:
|
|
|
+ Test() :
|
|
|
+ m_client(std::bind(&Test::Callback, this, std::placeholders::_1))
|
|
|
+ {
|
|
|
+ Network::Dns::Query query;
|
|
|
+ query.SetType(Network::Dns::QueryType::A);
|
|
|
+ query.SetClass(Network::Dns::QueryClass::IN);
|
|
|
+ query.SetName(Network::Dns::Name("_http", "_tcp", "local"));
|
|
|
+
|
|
|
+ m_client.Query(query);
|
|
|
+ }
|
|
|
+
|
|
|
+ void Callback(const std::vector<Network::Dns::ResourceRecord> records)
|
|
|
+ {
|
|
|
+ Logging::Log(Logging::Severity::Info, "Callback");
|
|
|
+ for(auto& record : records)
|
|
|
+ {
|
|
|
+ if(record.GetType() == Network::Dns::Type::A)
|
|
|
+ {
|
|
|
+ std::vector<uint8_t> data = record.GetResourceData();
|
|
|
+
|
|
|
+ std::stringstream ss;
|
|
|
+ ss << static_cast<int>(data.at(0)) << "." << static_cast<int>(data.at(1)) << "." << static_cast<int>(data.at(2)) << "." << static_cast<int>(data.at(3));
|
|
|
+ asio::ip::address_v4 address = asio::ip::address_v4::from_string(ss.str());
|
|
|
+
|
|
|
+ if (std::find(m_addresses.begin(), m_addresses.end(), address) == m_addresses.end())
|
|
|
+ m_addresses.push_back(address);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ void Print()
|
|
|
+ {
|
|
|
+ std::stringstream ss;
|
|
|
+ ss << m_addresses.size() << " IPs" << std::endl;
|
|
|
+ for (auto& address : m_addresses)
|
|
|
+ ss << " " << address.to_string() << std::endl;
|
|
|
+ Logging::Log(Logging::Severity::Info, ss.str());
|
|
|
+ }
|
|
|
+
|
|
|
+private:
|
|
|
+ Network::Dns::MulticastDnsClient m_client;
|
|
|
+ std::vector<asio::ip::address_v4> m_addresses;
|
|
|
+};
|
|
|
+
|
|
|
+bool TestMulticastDNS()
|
|
|
+{
|
|
|
+ Test test;
|
|
|
+ test.Print();
|
|
|
+
|
|
|
+ sleep(4);
|
|
|
+
|
|
|
+ test.Print();
|
|
|
+
|
|
|
+ return true;
|
|
|
+}
|
|
|
+
|
|
|
+} // namespace Test
|
|
|
+} // namespace Network
|