c ++ преобразовать доменное имя в IP-адрес с помощью getaddrinfo - PullRequest
0 голосов
/ 17 октября 2019

Здравствуйте, я создал функцию, используя устаревшее 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

}

...