Здравствуйте, я создал функцию, используя устаревшее gethostbyname для преобразования доменного имени в IP-адрес, и это прекрасно работает, однако это вызывает много предупреждений, и моя работа хочет, чтобы я использовал более новый getaddrinfo.
Хотяя могу заставить работать getaddrinfo, и он распечатывает IP-адрес, он также распечатывает информацию о шлюзе и многое другое, но все, что я хочу, это IP-адрес доменного имени. Из размещения точек останова в функции я вижу, что это 5-ая переменная в структуре, хотя опять же моя работа не хочет, чтобы я просто повторял 5 раз, поскольку это может измениться в будущем «Я сомневаюсь, что это все же ..»
Итак, я спрашиваю, есть ли способ получить доступ к структуре или установить - прочитать флаг, чтобы получить только IP-адрес имени хоста?
Вот мой код, новый и старая, и новая функция
// OLD FUNCTION
std::string getHostNameIpAddress(const std::string& a_domainName)
{
struct in_addr addr;
std::string ipAddress;
WSADATA wsaData;
int iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
if (iResult != 0)
{
ErrorMessage("WSAStartup failed: " << iResult);
}
else
{
struct hostent* remoteHost = gethostbyname(a_domainName.c_str());
if (remoteHost == NULL)
{
DWORD dwError = WSAGetLastError();
if (dwError != 0) {
if (dwError == WSAHOST_NOT_FOUND)
{
ErrorMessage("Host not found.");
}
else if (dwError == WSANO_DATA)
{
ErrorMessage("No domain name record found.");
}
else
{
ErrorMessage("Domain name lookup failed with error: " << dwError);
}
}
}
else
{
addr.s_addr = *(u_long*)remoteHost->h_addr_list[0];
TechSupportTraceA("IP Address: " << inet_ntoa(addr));
ipAddress = inet_ntoa(addr);
}
}
return ipAddress;
}
И новая функция, использующая getaddrinfo, которую я скопировал из учебника с небольшими изменениями.
std::string getHostNameIpAddress(const char* a_domainName)
{
struct addrinfo hints, * res;
int errcode;
char addrstr[100];
void* ptr;
memset(&hints, 0, sizeof(hints));
hints.ai_family = PF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
hints.ai_flags |= AI_CANONNAME;
errcode = getaddrinfo(a_domainName, NULL, &hints, &res);
if (errcode != 0)
{
cout("getaddrinfo failed with error: " << errcode);
WSACleanup();
return "";
}
cout("Host: " << a_domainName);
while (res)
{
switch (res->ai_family)
{
case AF_INET:
ptr = &((struct sockaddr_in*) res->ai_addr)->sin_addr;
inet_ntop(res->ai_family, ptr, addrstr, 100);
break;
case AF_INET6:
ptr = &((struct sockaddr_in6*) res->ai_addr)->sin6_addr;
inet_ntop(res->ai_family, ptr, addrstr, 100);
break;
}
// domain name IP is the 5th
cout("IPv" << (res->ai_family == PF_INET6 ? "6" : "4") << " address = " << addrstr)
res = res->ai_next;
}
return addrstr; / / retuns wrong address as it interates past the domain name to the gateway ip
}