gethostbyaddr () возвращает ноль

0

Я знаю, что этот вопрос задавали здесь раньше, и я прочитал все ответы, но не смог решить это самостоятельно. Здесь сделка: я должен сделать программу, которая берет кучу интернет-адресов (например, 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-адрес. Любая помощь будет оценена.

  • 0
    hostent* NULL или поле h_name NULL ?
  • 0
    Нет необходимости (и это действительно не рекомендуется) добавлять теги к заголовку. В идеале заголовок должен составлять (более или менее) грамматическое, краткое предложение
Показать ещё 1 комментарий
Теги:

2 ответа

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню