23 #include "../util/scheduler.hpp" 25 #include <boost/asio/io_service.hpp> 26 #include <boost/asio/ip/udp.hpp> 36 typedef protocol::resolver::query
query;
41 : m_resolver(ioService)
42 , m_addressSelector(addressSelector)
43 , m_scheduler(ioService)
45 BOOST_ASSERT(m_addressSelector !=
nullptr);
53 const shared_ptr<Resolver>&
self)
55 m_onSuccess = onSuccess;
58 m_resolver.async_resolve(q, bind(&Resolver::onResolveResult,
this, _1, _2,
self));
60 m_resolveTimeout = m_scheduler.
scheduleEvent(timeout, bind(&Resolver::onResolveTimeout,
this,
self));
66 return selectAddress(m_resolver.resolve(q));
71 onResolveResult(
const boost::system::error_code& error,
72 iterator it,
const shared_ptr<Resolver>&
self)
76 m_resolver.get_io_service().post(bind([] (
const shared_ptr<Resolver>&) {},
self));
83 m_onError(
"Hostname cannot be resolved: " + error.message());
88 it = selectAddress(it);
90 if (it !=
iterator() && m_onSuccess) {
91 m_onSuccess(it->endpoint().address());
94 m_onError(
"No endpoints match the specified address selector");
99 onResolveTimeout(
const shared_ptr<Resolver>&
self)
103 m_resolver.get_io_service().post(bind([] (
const shared_ptr<Resolver>&) {},
self));
106 m_onError(
"Hostname resolution timed out");
110 selectAddress(iterator it)
const 113 !m_addressSelector(it->endpoint().address())) {
121 protocol::resolver m_resolver;
135 boost::asio::io_service& ioService,
139 auto resolver = make_shared<Resolver>(ref(ioService), addressSelector);
140 resolver->asyncResolve(
Resolver::query(host,
""), onSuccess, onError, timeout, resolver);
146 boost::asio::io_service& ioService,
149 Resolver resolver(ioService, addressSelector);
153 BOOST_THROW_EXCEPTION(
Error(
"No endpoints match the specified address selector"));
156 return it->endpoint().address();
Copyright (c) 2011-2015 Regents of the University of California.
Resolver(boost::asio::io_service &ioService, const AddressSelector &addressSelector)
function< void(const IpAddress &address)> SuccessCallback
protocol::resolver::query query
EventId scheduleEvent(const time::nanoseconds &after, const Event &event)
Schedule a one-time event after the specified delay.
void cancelEvent(const EventId &eventId)
Cancel a scheduled event.
function< bool(const IpAddress &address)> AddressSelector
function< void(const std::string &reason)> ErrorCallback
boost::asio::ip::udp protocol
Table::const_iterator iterator
std::shared_ptr< ns3::EventId > EventId
protocol::resolver::iterator iterator
iterator syncResolve(const query &q)
void asyncResolve(const query &q, const SuccessCallback &onSuccess, const ErrorCallback &onError, time::nanoseconds timeout, const shared_ptr< Resolver > &self)
boost::asio::ip::address IpAddress