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;
*
* @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 )
{
}
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;
}
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() )
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
// '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;
GlobalLogger.info() << "- " << current_ip << " [" << current_ttl << "s]" << endl;
}
}
+
+void DnsResolver::append_resolved_ipv6(
+ const shared_ptr<resource_base_t> resource_record,
+ HostAddressList *resolved_host_address_list
+) const
+{
+ BOOST_ASSERT( resource_record->rtype() == boost::net::dns::type_a6 );
+
+ a6_resource *a6_rr = dynamic_cast<a6_resource *> ( 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;
+ }
+}
#include <string>
#include <boost/net/dns.hpp>
+#include <boost/shared_ptr.hpp>
#include "dns/hostaddress.h"
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;
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
const shared_ptr<boost::net::dns::resource_base_t> resource_record,
std::list<HostAddress> *resolved_host_address_list
) const;
+ void append_resolved_ipv6(
+ const shared_ptr<boost::net::dns::resource_base_t> resource_record,
+ std::list<HostAddress> *resolved_host_address_list
+ ) const;
private:
/// The list of IPs available to the host DNS.
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<DnsResolver> DnsResolverItem;
+
#endif // DNS_RESOLVER_H