From e556755158cd98a7fa11826ccfb61eafce6eafe6 Mon Sep 17 00:00:00 2001 From: Guilherme Maciel Ferreira Date: Fri, 11 Mar 2011 10:26:59 +0100 Subject: [PATCH] Bring aboard the first scratch of a DNS resolver - given a host DNS, this class resolves and keeps a list of IPs for that host --- src/CMakeLists.txt | 3 ++ src/dns/dnsresolver.cpp | 71 +++++++++++++++++++++++++++++++++++++++++++++++ src/dns/dnsresolver.h | 29 +++++++++++++++++++ src/dns/hostaddress.cpp | 38 +++++++++++++++++++++++++ src/dns/hostaddress.h | 29 +++++++++++++++++++ 5 files changed, 170 insertions(+), 0 deletions(-) create mode 100644 src/dns/dnsresolver.cpp create mode 100644 src/dns/dnsresolver.h create mode 100644 src/dns/hostaddress.cpp create mode 100644 src/dns/hostaddress.h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 287be48..ad8bca9 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,6 +1,7 @@ # include directories where the source code is located include_directories( config + dns icmp ping ${Boost_INCLUDE_DIRS} @@ -11,6 +12,8 @@ set( SOURCES config/configuration.cpp config/configurationreader.cpp config/host.cpp + dns/dnsresolver.cpp + dns/hostaddress.cpp icmp/icmpheader.cpp icmp/icmppacket.cpp icmp/ipv4header.cpp diff --git a/src/dns/dnsresolver.cpp b/src/dns/dnsresolver.cpp new file mode 100644 index 0000000..9851135 --- /dev/null +++ b/src/dns/dnsresolver.cpp @@ -0,0 +1,71 @@ +#include +#include + +#include "hostaddress.h" + +#include "dnsresolver.h" + +using namespace std; +using namespace boost::asio; +using namespace boost::asio::ip; + +//----------------------------------------------------------------------------- +// DnsResolver +//----------------------------------------------------------------------------- + +DnsResolver::DnsResolver( string dns_address ) : + ResolvedHostAddressList() +{ + resolve( dns_address ); +} + +DnsResolver::~DnsResolver() +{ +} + +string DnsResolver::get_next_ip() +{ + uint list_size_before = ResolvedHostAddressList.size(); + + HostAddress host_address = ResolvedHostAddressList.front(); + ResolvedHostAddressList.pop_front(); + string destination_ip = host_address.get_ip(); + ResolvedHostAddressList.push_back( host_address ); + + uint list_size_after = ResolvedHostAddressList.size(); + BOOST_ASSERT( list_size_before == list_size_after ); + + return destination_ip; +} + +/** + * Resolve which IPs belong to the given DNS and build a list of these IPs. + * + * @param dns_address The DNS address to be query for IPs. + */ +void DnsResolver::resolve( string dns_address ) +{ + BOOST_ASSERT( !dns_address.empty() ); + + cerr << " - Host : " << dns_address << endl; + + io_service io_service; + tcp::resolver resolver( io_service ); + tcp::resolver::query query( tcp::v4(), dns_address, "" ); + tcp::resolver::iterator it_first = resolver.resolve( query ); + tcp::resolver::iterator it_last = tcp::resolver::iterator(); + while ( it_first != it_last ) + { + string ip = (*it_first).endpoint().address().to_string(); + + HostAddress resolved_host; + resolved_host.set_ip( ip ); + ResolvedHostAddressList.push_back( resolved_host ); + + cerr << " |_ " << ip << endl; + + ++it_first; + } + + BOOST_ASSERT( 0 < ResolvedHostAddressList.size() ); +} diff --git a/src/dns/dnsresolver.h b/src/dns/dnsresolver.h new file mode 100644 index 0000000..656e07b --- /dev/null +++ b/src/dns/dnsresolver.h @@ -0,0 +1,29 @@ +#ifndef DNSRESOLVER_H +#define DNSRESOLVER_H + +#include +#include + +class HostAddress; + +//----------------------------------------------------------------------------- +// DnsResolver +//----------------------------------------------------------------------------- + +class DnsResolver +{ +public: + DnsResolver( std::string dns_address ); + virtual ~DnsResolver(); + + std::string get_next_ip(); + +private: + void resolve( std::string dns_address ); + +private: + std::list ResolvedHostAddressList; + +}; + +#endif /* DNSRESOLVER_H */ diff --git a/src/dns/hostaddress.cpp b/src/dns/hostaddress.cpp new file mode 100644 index 0000000..edb696d --- /dev/null +++ b/src/dns/hostaddress.cpp @@ -0,0 +1,38 @@ +#include "hostaddress.h" + +using namespace std; + +//----------------------------------------------------------------------------- +// HostAddress +//----------------------------------------------------------------------------- + +HostAddress::HostAddress() : + Ip( "" ), + Ttl( 0 ) +{ +} + +HostAddress::~HostAddress() +{ +} + +void HostAddress::set_ip( string ip ) +{ + this->Ip = ip; +} + +string HostAddress::get_ip() const +{ + return Ip; +} + +uint HostAddress::get_ttl() const +{ + return Ttl; +} + +void HostAddress::set_ttl( uint ttl ) +{ + this->Ttl = ttl; +} + diff --git a/src/dns/hostaddress.h b/src/dns/hostaddress.h new file mode 100644 index 0000000..9bbf3a2 --- /dev/null +++ b/src/dns/hostaddress.h @@ -0,0 +1,29 @@ +#ifndef HOSTADDRESS_H_ +#define HOSTADDRESS_H_ + +#include +#include + +//----------------------------------------------------------------------------- +// HostAddress +//----------------------------------------------------------------------------- + +class HostAddress +{ +public: + HostAddress(); + virtual ~HostAddress(); + + std::string get_ip() const; + void set_ip( std::string ip ); + + uint get_ttl() const; + void set_ttl( uint ttl ); + +private: + std::string Ip; + uint Ttl; + +}; + +#endif /* HOSTADDRESS_H_ */ -- 1.7.1