mDNSTest.cpp 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. #include "Dns/MulticastDnsClient.h"
  2. #include <asio.hpp>
  3. #include <Logging.h>
  4. #include <functional>
  5. #include <unistd.h>
  6. namespace Network {
  7. namespace Test {
  8. class Test
  9. {
  10. public:
  11. Test() :
  12. m_client(std::bind(&Test::Callback, this, std::placeholders::_1))
  13. {
  14. Network::Dns::Query query;
  15. query.SetType(Network::Dns::QueryType::A);
  16. query.SetClass(Network::Dns::QueryClass::IN);
  17. query.SetName(Network::Dns::Name("_http", "_tcp", "local"));
  18. m_client.Query(query);
  19. }
  20. void Callback(const std::vector<Network::Dns::ResourceRecord> records)
  21. {
  22. Logging::Log(Logging::Severity::Info, "Callback");
  23. for(auto& record : records)
  24. {
  25. if(record.GetType() == Network::Dns::Type::A)
  26. {
  27. std::vector<uint8_t> data = record.GetResourceData();
  28. std::stringstream ss;
  29. 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));
  30. asio::ip::address_v4 address = asio::ip::address_v4::from_string(ss.str());
  31. if (std::find(m_addresses.begin(), m_addresses.end(), address) == m_addresses.end())
  32. m_addresses.push_back(address);
  33. }
  34. }
  35. }
  36. void Print()
  37. {
  38. std::stringstream ss;
  39. ss << m_addresses.size() << " IPs" << std::endl;
  40. for (auto& address : m_addresses)
  41. ss << " " << address.to_string() << std::endl;
  42. Logging::Log(Logging::Severity::Info, ss.str());
  43. }
  44. private:
  45. Network::Dns::MulticastDnsClient m_client;
  46. std::vector<asio::ip::address_v4> m_addresses;
  47. };
  48. bool TestMulticastDNS()
  49. {
  50. Test test;
  51. test.Print();
  52. sleep(4);
  53. test.Print();
  54. return true;
  55. }
  56. } // namespace Test
  57. } // namespace Network