From: Guilherme Maciel Ferreira Date: Sun, 4 Mar 2012 23:55:34 +0000 (-0300) Subject: Added AAAA resource records in the DNS query. X-Git-Tag: v1.5~1^2~21 X-Git-Url: http://developer.intra2net.com/git/?a=commitdiff_plain;h=43c5260b4cdc7f16a03c2cc5b727989d8a7ca32d;p=pingcheck Added AAAA resource records in the DNS query. - DNS resolve to IPv6 addresses. --- diff --git a/src/dns/dnsresolver.cpp b/src/dns/dnsresolver.cpp index 40aaaae..21f7f31 100644 --- a/src/dns/dnsresolver.cpp +++ b/src/dns/dnsresolver.cpp @@ -36,6 +36,7 @@ using namespace std; using boost::asio::io_service; using boost::asio::ip::address; using boost::net::dns::a_resource; +using boost::net::dns::a6_resource; using boost::net::dns::resource_base_t; using boost::net::dns::message; using boost::net::dns::rr_list_t; @@ -52,14 +53,18 @@ using I2n::Logger::GlobalLogger; * * @param dns_address The DNS address to resolve. * @param nameserver The server to consult about name resolution. + * @param address_resource_record_type 'A' resource records for the IPv4 addresses, or 'AAAA' + * resource records for the IPv6 addresses */ DnsResolver::DnsResolver( const string &dns_address, - const string &nameserver + const string &nameserver, + const type_t address_resource_record_type ) : ResolvedHostAddressList(), HostDnsAddress( dns_address ), - NameServer( nameserver ) + NameServer( nameserver ), + AddressResourceRecord( address_resource_record_type ) { } @@ -90,13 +95,11 @@ bool DnsResolver::resolve() try { - rr_list_t answers_list = fill_answers_list( HostDnsAddress, NameServer, boost::net::dns::type_a ); - + rr_list_t answers_list = get_answers_list( HostDnsAddress, NameServer, AddressResourceRecord ); size_t resolved_ip_count = answers_list.size(); if ( resolved_ip_count < 1 ) { - GlobalLogger.error() << "Error: host " - << HostDnsAddress << " could not be resolved." << endl; + GlobalLogger.error() << "Error: IP host " << HostDnsAddress << " could not be resolved." << endl; return false; } @@ -191,8 +194,7 @@ bool DnsResolver::handle_ip_address() try { - // Convert string to IP address - // Work with both IPv4 and IPv6 + // Convert string to IP address, to work with both IPv4 and IPv6 address addr = address::from_string( HostDnsAddress ); if ( addr.is_v4() || addr.is_v6() ) @@ -218,7 +220,7 @@ bool DnsResolver::handle_ip_address() return false; } -rr_list_t DnsResolver::fill_answers_list( +rr_list_t DnsResolver::get_answers_list( const string &host_dns_address, const string &name_server, const type_t message_type @@ -256,6 +258,10 @@ void DnsResolver::fill_resolved_ip_list( // 'A' resource records carry IPv4 addresses append_resolved_ipv4( resource_record, resolved_host_address_list ); break; + case boost::net::dns::type_a6: + // 'AAAA' resource records carry IPv6 addresses + append_resolved_ipv6( resource_record, resolved_host_address_list ); + break; default: // other types of resource records break; @@ -289,3 +295,23 @@ void DnsResolver::append_resolved_ipv4( GlobalLogger.info() << "- " << current_ip << " [" << current_ttl << "s]" << endl; } } + +void DnsResolver::append_resolved_ipv6( + const shared_ptr resource_record, + HostAddressList *resolved_host_address_list +) const +{ + BOOST_ASSERT( resource_record->rtype() == boost::net::dns::type_a6 ); + + a6_resource *a6_rr = dynamic_cast ( resource_record.get() ); + if ( a6_rr != NULL ) + { + string current_ip = a6_rr->address().to_string(); + uint32_t current_ttl = a6_rr->ttl(); + + HostAddress resolved_host( current_ip, current_ttl ); + resolved_host_address_list->push_back( resolved_host ); + + GlobalLogger.info() << "- " << current_ip << " [" << current_ttl << "s]" << endl; + } +} diff --git a/src/dns/dnsresolver.h b/src/dns/dnsresolver.h index b24cb2c..74f1b70 100644 --- a/src/dns/dnsresolver.h +++ b/src/dns/dnsresolver.h @@ -23,6 +23,7 @@ on this file might be covered by the GNU General Public License. #include #include +#include #include "dns/hostaddress.h" @@ -38,11 +39,13 @@ class DnsResolver public: DnsResolver( const std::string &dns_address, - const std::string &nameserver + const std::string &nameserver, + const boost::net::dns::type_t address_resource_record_type ); ~DnsResolver(); bool resolve(); + int get_resolved_ip_count() const; std::string get_next_ip(); bool expired_resolved_ip() const; @@ -50,7 +53,7 @@ public: private: bool handle_ip_address(); - boost::net::dns::rr_list_t fill_answers_list( + boost::net::dns::rr_list_t get_answers_list( const std::string &host_dns_address, const std::string &name_server, const boost::net::dns::type_t message_type @@ -63,6 +66,10 @@ private: const shared_ptr resource_record, std::list *resolved_host_address_list ) const; + void append_resolved_ipv6( + const shared_ptr resource_record, + std::list *resolved_host_address_list + ) const; private: /// The list of IPs available to the host DNS. @@ -71,7 +78,15 @@ private: const std::string HostDnsAddress; /// The address of the server which can resolve the host address. const std::string NameServer; + /// 'A' resource records for the IPv4 addresses, or 'AAAA' resource records for the IPv6 addresses + boost::net::dns::type_t AddressResourceRecord; }; +//----------------------------------------------------------------------------- +// DnsResolverItem +//----------------------------------------------------------------------------- + +typedef boost::shared_ptr DnsResolverItem; + #endif // DNS_RESOLVER_H