我正在尝试从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";
}
Run Code Online (Sandbox Code Playgroud)
我尝试过使用
gethostbyaddr()
和getnameinfo()
[...].有没有更好的方法将IP地址转换为有效的主机名?
不,getnameinfo()
是选择的方法.
您可以检查getnameinfo()
反对的结果EAI_AGAIN
,如果相等则重试请求.
收到EAI_OVERFLOW
并不意味着你没有回应.无论如何,当你提供259个字符来把结果放在你身上时,很可能不会得到EAI_OVERFLOW
...... ;-)
顺便说一句:兴奋剂是正确的,因为他坚持getaddrinfo()
和getnameinfo()
......的评论 - gethostbyaddr()
并且gethostbyname()
在某种程度上被弃用了.处理它们的结果也很复杂,并且往往会引起编程错误.
我正在使用Windows这么抱歉(你可以跳过WSADATA部分,如果你正在使用*nix)关于这个版本:)
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <winsock2.h>
int main(){
struct addrinfo hints;
struct addrinfo *res=0;
int status;
WSADATA wsadata;
int statuswsadata;
if((statuswsadata=WSAStartup(MAKEWORD(2,2),&wsadata))!=0){
printf("WSAStartup failed: %d\n",statuswsadata);
}
hints.ai_family =AF_INET;
status=getaddrinfo("87.250.251.11",0,0,&res);
{
char host[512],port[128];
status=getnameinfo(res->ai_addr,res->ai_addrlen,host,512,0,0,0);
printf("Host: %s",host);
freeaddrinfo(res);
}
}
Run Code Online (Sandbox Code Playgroud)
我明白了:
d:\temp\stack>ip
Host: yandex.ru
Run Code Online (Sandbox Code Playgroud)
87.250.251.11这是主机yandex.ru的网络地址:
C:\Users\user>ping yandex.ru
Pinging yandex.ru [87.250.251.11] with 32 bytes of data:
Reply from 87.250.251.11: bytes=32 time=21ms TTL=56
Reply from 87.250.251.11: bytes=32 time=21ms TTL=56
Reply from 87.250.251.11: bytes=32 time=21ms TTL=56
Ping statistics for 87.250.251.11:
Packets: Sent = 3, Received = 3, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum = 21ms, Maximum = 21ms, Average = 21ms
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助.