C++ 将ip解析为主机名

C++ 将ip解析为主机名,c++,c,sockets,C++,C,Sockets,我正在尝试从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";

我正在尝试从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";
}
char*ip=argv[1];
//使用gethostbyaddr()
hostent*phe=gethostbyaddr(ip、strlen(ip)、AF_INET);
如果(phe){
你能说出你的名字吗
我已经尝试过使用
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()
是选择的方法


您可以再次根据
EAI\u检查
getnameinfo()
的结果,如果相等,请重试请求


同时,接收到
EAI_溢出
并不意味着没有响应。无论如何,当您提供259个字符将结果放入时,您很可能不会得到
EAI_溢出
。-)



顺便说一句:是正确的,坚持使用
getaddrinfo()
getnameinfo()
…-
gethostbyaddr()
gethostbyname()
都不太受欢迎。另外,处理它们的结果很复杂,往往会引发编程错误。

我正在使用Windows,非常抱歉(如果使用*nix,可以跳过WSADATA部分)关于此版本:)

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

希望这能有所帮助。

并非所有IP地址都有反向主机名。是什么让你认为不返回主机名的IP地址应该有反向主机名?@Bruno-在某些情况下,当我没有主机名时,我尝试从终端运行
nslookup
,并且命令确实返回主机名。因此我认为可能有一个反向主机名我知道这不是一个答案,但你应该坚持使用getaddrinfo和getnameinfo,因为它们在Ipv4和Ipv6网络地址中都很有用。
gethostbyaddr()
不会将
char*
作为第一个参数!
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