#include <arpa/inet.h>
#include <netdb.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <cstdlib>
#include <cstring>
#include <iostream>
void Usage(char* progname) {
std::cerr << "usage: " << progname << " hostname" << std::endl;
exit(EXIT_FAILURE);
}
int main(int argc, char** argv) {
if (argc != 2) {
Usage(argv[0]);
}
struct addrinfo hints;
memset(&hints, 0, sizeof(hints));
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
struct addrinfo* results;
int retval = getaddrinfo(argv[1], nullptr, &hints, &results);
if (retval != 0) {
std::cerr << "getaddrinfo failed: " << gai_strerror(retval) << std::endl;
return EXIT_FAILURE;
}
std::cout << "addresses for '" << argv[1] << "':" << std::endl;
for (struct addrinfo* r = results; r != nullptr; r = r->ai_next) {
if (r->ai_family == AF_INET) {
char ipstring[INET_ADDRSTRLEN];
struct sockaddr_in* v4addr = reinterpret_cast<sockaddr_in*>(r->ai_addr);
inet_ntop(AF_INET, &(v4addr->sin_addr), ipstring, INET_ADDRSTRLEN);
std::cout << " IPv4: " << ipstring << std::endl;
} else if (r->ai_family == AF_INET6) {
char ipstring[INET6_ADDRSTRLEN];
struct sockaddr_in6* v6addr =
reinterpret_cast<sockaddr_in6*>(r->ai_addr);
inet_ntop(AF_INET6, &(v6addr->sin6_addr), ipstring, INET6_ADDRSTRLEN);
std::cout << " IPv6: " << ipstring << std::endl;
} else {
std::cout << " unknown address family " << r->ai_family << std::endl;
}
}
freeaddrinfo(results);
return EXIT_SUCCESS;
}