The domain's IP addresses (yes plural, there can be more than 1) is in the hostent::h_addr_list
field, not in the hostent::h_aliases
field, eg:
int main()
{
hostent* myHostent = gethostbyname("google.com");
if (!myHostent)
{
cerr << "gethostbyname() failed" << "\n";
}
else
{
cout << myHostent->h_name << "\n";
char ip[INET6_ADDRSTRLEN];
for (unsigned int i = 0; myHostent->h_addr_list[i] != NULL; ++i)
{
cout << inet_ntop(myHostent->h_addrtype, myHostent->h_addr_list[i], ip, sizeof(ip)) << "\n";
}
}
return 0;
}
That said, gethostbyname()
is deprecated, use getaddrinfo()
instead, eg:
void* getSinAddr(addrinfo *addr)
{
switch (addr->ai_family)
{
case AF_INET:
return &(reinterpret_cast<sockaddr_in*>(addr->ai_addr)->sin_addr);
case AF_INET6:
return &(reinterpret_cast<sockaddr_in6*>(addr->ai_addr)->sin6_addr);
}
return NULL;
}
int main()
{
addrinfo hints = {};
hints.ai_flags = AI_CANONNAME;
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = IPPROTO_TCP;
addrinfo *res;
int ret = getaddrinfo("google.com", NULL, &hints, &res);
if (ret != 0)
{
cerr << "getaddrinfo() failed: " << gai_strerror(ret) << "\n";
}
else
{
cout << res->ai_canonname << "\n";
char ip[INET6_ADDRSTRLEN];
for(addrinfo addr = res; addr; addr = addr->ai_next)
{
cout << inet_ntop(addr->ai_family, getSinAddr(addr), ip, sizeof(ip)) << "\n";
}
freeaddrinfo(res);
}
return 0;
}