C++ DNS Lookup IPv4 IPv6
#include <cstring> //memset
#include <netdb.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <iostream>
#include <string>
#include <vector>
using std::vector;
using std::string;
using std::cout;
using std::endl;
vector<string> dns_lookup(const string &host_name, int ipv=4);
int main(int argc, char* argv[])
{
int ipv;
vector<string> domains;
cout << "dns ipv4: www.google.com" << endl;
domains = dns_lookup("www.google.com", ipv=4);
for(int i=0,ix=domains.size(); i<ix; i++)
cout << " " << domains[i] << endl;
cout << "dns ipv6: www.google.com" << endl;
domains = dns_lookup("www.google.com", ipv=6);
for(int i=0,ix=domains.size(); i<ix; i++)
cout << " " << domains[i] << endl;
cout << "dns both: www.google.com" << endl;
domains = dns_lookup("www.google.com", ipv=0);
for(int i=0,ix=domains.size(); i<ix; i++)
cout << " " << domains[i] << endl;
return 0;
}
vector<string> dns_lookup(const string &host_name, int ipv)
{
vector<string> output;
struct addrinfo hints, *res, *p;
int status, ai_family;
char ip_address[INET6_ADDRSTRLEN];
ai_family = ipv==6 ? AF_INET6 : AF_INET; //v4 vs v6?
ai_family = ipv==0 ? AF_UNSPEC : ai_family; // AF_UNSPEC (any), or chosen
memset(&hints, 0, sizeof hints);
hints.ai_family = ai_family;
hints.ai_socktype = SOCK_STREAM;
if ((status = getaddrinfo(host_name.c_str(), NULL, &hints, &res)) != 0) {
//cerr << "getaddrinfo: "<< gai_strerror(status) << endl;
return output;
}
//cout << "DNS Lookup: " << host_name << " ipv:" << ipv << endl;
for(p = res;p != NULL; p = p->ai_next) {
void *addr;
if (p->ai_family == AF_INET) { // IPv4
struct sockaddr_in *ipv4 = (struct sockaddr_in *)p->ai_addr;
addr = &(ipv4->sin_addr);
} else { // IPv6
struct sockaddr_in6 *ipv6 = (struct sockaddr_in6 *)p->ai_addr;
addr = &(ipv6->sin6_addr);
}
// convert the IP to a string
inet_ntop(p->ai_family, addr, ip_address, sizeof ip_address);
output.push_back(ip_address);
}
freeaddrinfo(res); // free the linked list
return output;
}code snippets are licensed under Creative Commons CC-By-SA 3.0 (unless otherwise specified)
|