我知道這個問題之前曾在這裏問過,我讀過所有的答案,但無法自行解決這個問題。這裏的交易: 我必須製作一個程序,它需要一堆互聯網地址(如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地址。任何幫助將不勝感激。
是'hostent *''NULL'或者是'h_name'場'NULL'? – JaredPar
將標籤添加到標題是沒有必要的(也不鼓勵)。理想情況下,標題應該形成一個(或多或少)語法,句子簡練上 –
相同的系統,在命令行,如果你運行'主機'然後'主機'你得到兩個答案? –