2013-12-12 25 views
0

我知道這個問題之前曾在這裏問過,我讀過所有的答案,但無法自行解決這個問題。這裏的交易: 我必須製作一個程序,它需要一堆互聯網地址(如google.com,www.root.cz)並打印出一個正式名稱,備用名稱和IP地址以及別名的域名。 我們已經有了一個沒有別名域名的地址的示例代碼,所以我使用了它,然後做了一些更改以適應我的需要。代碼如下所示:gethostbyaddr()返回null

#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地址。任何幫助將不勝感激。

+0

是'hostent *''NULL'或者是'h_name'場'NULL'? – JaredPar

+0

將標籤添加到標題是沒有必要的(也不鼓勵)。理想情況下,標題應該形成一個(或多或少)語法,句子簡練上 –

+0

相同的系統,在命令行,如果你運行'主機'然後'主機'你得到兩個答案? –

回答

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()是過時的函數

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;