В настоящее время я работаю над «списком того, что происходит в локальной сети», и теперь я застрял в части «дай мне имя хоста для этого IP».
Я уже пробовал getnameinfo и gethostbyaddr, но первый возвращает (почти) всегда заданный IP вместо имени хоста, второй возвращает некоторые странные вещи, такие как ANantes-651-1-49-net.w2-0.abo.wanadoo.fr
…
Мой вопрос: как я могу сделать эту работу?
Примечание: это не значит, что нет имени хоста, связанного хотя бы с одним из IP, например dig +short -x 192.168.178.1
вернуть fritz.box.
как следует, а также host 192.168.178.1
дает правильный ответ
1.178.168.192.in-addr.arpa domain name pointer fritz.box.
Дополнительное примечание: В моем исследовании я наткнулся на библиотеку, называемую «adns», но под «наткнулся на» я имею в виду «почти буквально наткнулся на», так как нет ни малейшего следа документации, примеров или тому подобного … Так что если у кого-то есть пример использования adns, это было бы здорово …
Да ладно … Похоже, я напортачил несколько вещей в стиле почти «обезьяна хочу банан» …
№ 1:
Я использовал это:
...
sockaddr_in address;
memset(&address, 0, sizeof(address));
address.sin_family = AF_INET;
address.sin_addr.s_addr = inet_addr("192.168.178.1");
struct hostent *h =gethostbyaddr((const void *)&address, sizeof(address), AF_INET);
...
Вместо правильного:
...
in_addr address;
inet_aton("192.168.178.1",&address);
struct hostent *h = gethostbyaddr((const void *)&address, sizeof(address), AF_INET);
...
№ 2:
У меня была строка, где я проверял, было ли возвращенное имя хоста пустым, чтобы заменить его заполнителем, в зависимости от выбранного «формата отчета» (простой текст / xml / csv). Но по какой-то причине я написал это таким образом, чтобы ВСЕГДА заменялось имя хоста указанным заполнителем (черт возьми! Это было довольно очевидно, но я не видел его все время …).
НО ОКОНЧАТЕЛЬНО: ДА! Оно работает…
Других решений пока нет …