gethostbyaddr()返回null

时间:2013-12-12 20:18:20

标签: c++ linux

我知道此问题之前已在此处提出并且我已阅读所有答案,但无法自行解决此问题。这是交易: 我必须制作一个程序,它需要一堆互联网地址(如google.com,www.root.cz),并打印出官方名称,替代名称和IP地址以及别名的域名。 我们有一个没有别名域名的1个地址的示例代码,所以我使用它,然后进行了一些更改以满足我的需求。 代码如下所示:

#include <iostream>
#include <netdb.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/socket.h>

int main (int argc, char *argv[])
{

for (int i = 1; i < argc; ++i){
    hostent *H = gethostbyname(argv[i]);
    if (H == NULL)
    {
        std::cerr << "Nepodařilo se zjistit adresu" << std::endl;
            return -1;
    }
    std::cout << "Oficiální jméno: " << H->h_name << std::endl;
    std::cout << "Alternativy: " << std::endl;
    /* Budeme procházet pole H->h_aliases. Pole je ukončené NULL.*/
        char **alternativy = H->h_aliases;
    while(*alternativy != NULL)
{
    std::cout << "\t" << *(alternativy++) << std::endl;
}
/* Budeme procházet pole H->h_addr_list. Pole je ukončené NULL. 
       Zvolíme jiný postup než v předchozím případě.*/
std::cout << "Adresy: " << std::endl;
    for(int i = 0; H->h_addr_list[i] != NULL; ++i)
    {
        /* H->h_addr_list je binární forma IP adresy. Pro převod na
           tečkovou konvenci použijeme inet_ntoa.*/
const char* addr = inet_ntoa(*(in_addr *)H->h_addr_list[i]);
hostent *name = gethostbyaddr(addr, sizeof(addr), AF_INET);
std::cout<<addr<<"->"<<name<<std::endl;
}
std::cout<<std::endl;
}
    return 0;
}

一切正常。只有名称始终为空。我尝试在ubuntu 12.04上运行这个我在我的笔记本电脑和虚拟Debian Squeeze上(不记得数字)。我检查了一些配置文件,如前面的问题所述。还尝试配置更多DNS服务器。什么都行不通。 我也尝试过使用getnameinfo,但由于某种原因,它总是只返回给定的IP地址。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:0)

使用不正确的参数调用gethostbyaddr()时出错(它需要二进制地址,而不是字符串),另一个错误显示返回的名称(这是一个hostent字段)。我已经尝试了以下,似乎工作正常:

hostent *name = gethostbyaddr(H->h_addr_list[i], sizeof (struct in_addr), AF_INET);
std::cout << addr << "->" << name->h_name << std::endl;

答案 1 :(得分:0)

您传递的错误格式的IP要转换回主机名。

像这样改变你的意思。

for(int i = 0; H->h_addr_list[i] != NULL; ++i)
{
    /* H->h_addr_list je binární forma IP adresy. Pro převod na tečkovou konvenci použijeme inet_ntoa.*/
    const char* addr = inet_ntoa(*(in_addr *)H->h_addr_list[i]);
    hostent *name = gethostbyaddr((in_addr *)H->h_addr_list[i], sizeof(in_addr), AF_INET);
    std::cout<<addr<<"->"<<name->h_name<<std::endl;
}

还会查找getaddrinfo(),因为gethotbyname(),gethostbyaddr()是过时的功能