簡體   English   中英

gethostbyaddr()返回null

[英]gethostbyaddr() returns null

我知道在此之前曾問過這個問題,我已經閱讀了所有答案,但無法獨自解決。 這是交易:我必須編寫一個程序,該程序使用一堆Internet地址(例如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;
}

一切正常。 只有名稱始終為空。 我嘗試在筆記本電腦和虛擬Debian Squeeze(不記得編號)上的ubuntu 12.04上運行此文件。 我按照前面的問題檢查了一些配置文件。 還嘗試配置更多的DNS服務器。 什么都沒有。 我也嘗試使用getnameinfo,但是由於某種原因,它總是只返回給定的IP地址。 任何幫助將不勝感激。

調用帶有錯誤參數的gethostbyaddr()時出錯(它需要一個二進制地址,而不是字符串),另一個錯誤顯示返回的名稱(這是hostent的字段)。 我嘗試了以下方法,但似乎工作正常:

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

您傳遞了要轉換回主機名的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()是過時的函數

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM