我正在尝试从IP地址解析主机名。我尝试使用gethostbyaddr()getnameinfo(),但是在许多情况下,主机名根本无法解析。有没有更好的方法可以将IP地址转换为有效的主机名?

char* ip = argv[1];
// using gethostbyaddr()
hostent * phe = gethostbyaddr(ip, strlen(ip), AF_INET);
if(phe) {
  cout << phe->h_name << "\n";
}

// using getnameinfo()
char hostname[260];
char service[260];
sockaddr_in address;
memset(&address, 0, sizeof(address));
address.sin_family = AF_INET;
address.sin_addr.s_addr = inet_addr(ip);
int response = getnameinfo((sockaddr*)&address,
                            sizeof(address),
                            hostname,
                            260,
                            service,
                            260,
                            0);
if(response == 0) {
  cout << hostname << "\n";
}

最佳答案



不,getnameinfo()是选择的方法。

您可以根据getnameinfo()检查EAI_AGAIN的结果,如果相等,请重试该请求。

同时收到EAI_OVERFLOW并不意味着您没有回应。无论如何,当您提供259个字符来放置结果时,您很可能不会获得EAI_OVERFLOW ... ;-)

顺便说一句:在坚持使用getaddrinfo()getnameinfo()时,excanoehis comment是对的...-某种程度上已弃用gethostbyaddr()gethostbyname()。另外,处理它们的结果也很复杂,并且容易引起编程错误。

07-25 20:19