#include <boost/asio/ip/address.hpp>
#include <boost/system/error_code.hpp>
#include <boost/net/network_array.hpp> // dns_buffer_t
+#include <boost/uuid/uuid_generators.hpp>
#include "dns/resolverbase.h"
#include "dns/dnsmaster.h"
#include "dns/dnscache.h"
+typedef std::pair<std::string, std::string> string_pair;
+
+
class DnsResolver : public ResolverBase
{
public:
void handle_unavailable();
void handle_ips(const HostAddressVec &ips);
void handle_cname(const std::string &canonical_name);
+ void handle_recurse(const HostAddress &name_server);
void cname_resolve_callback(const std::string &canonical_name,
const bool was_success,
- const int cname_count);
- void finalize_resolve(const bool success, const int cname_count=0);
+ const int recursion_count);
+ void recursive_resolve_callback(const uint32_t min_ttl,
+ const bool was_success,
+ const int recursion_count);
+ void finalize_resolve(const bool success, const int recursion_count=0);
void stop_trying();
void wait_timer_timeout_handler(const boost::system::error_code &error);
+ void gather_results( const boost::net::dns::rr_list_t *answers,
+ HostAddressVec *result_ips,
+ std::vector<string_pair> *result_cnames,
+ std::vector<string_pair> *result_nameservers ) const;
// variables
private:
boost::asio::ip::udp::socket Socket;
boost::net::dns_buffer_t ReceiveBuffer;
+ boost::net::dns_buffer_t RequestBuffer;
DnsIpProtocol Protocol;
boost::asio::ip::udp::endpoint NameServer;
boost::asio::deadline_timer ResolveTimeoutTimer;
int RetryCount;
bool IsResolving;
std::string LogPrefix;
+ boost::uuids::random_generator RandomIdGenerator;
+ uint16_t RequestId;
+ ResolverItem Recursor;
};
#endif