我正在尝试从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()
时,excanoe与his comment是对的...-某种程度上已弃用gethostbyaddr()
和gethostbyname()
。另外,处理它们的结果也很复杂,并且容易引起编程错误。