【发布时间】:2012-05-12 14:18:14
【问题描述】:
我正在尝试从 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";
}
【问题讨论】:
-
并非所有 IP 地址都有反向主机名。是什么让您认为不返回主机名的 IP 地址应该有一个?
-
@Bruno - 在某些情况下,当我没有获得主机名时,我尝试从终端运行
nslookup <address>,并且该命令确实返回了主机名。所以我在想也许有更准确的方法来做这种事情。 -
我知道这不是一个答案,但您应该坚持使用 getaddrinfo 和 getnameinfo,因为它们在 Ipv4 和 Ipv6 网络地址的两种情况下都很有用。
-
gethostbyaddr()不将char*作为第一个参数!