Получить все хосты в сети LAN в C?

Можно ли получить все хосты в сети LAN (используя C). Мне нужно получить IP-адреса и имена хостов.


person user1812707    schedule 22.05.2013    source источник
comment
Я не знаю по-настоящему портативного способа сделать это, но это не значит, что его нет. Если у вас есть внутренний DNS-сервер, вы можете запросить его и отфильтровать на основе вашей локальной конфигурации IP (то есть всего, что соответствует 10.*.*.*). Но даже это не поймает машины, которые не зарегистрированы в DNS, а некоторые из них могут не быть, например. по соображениям безопасности.   -  person David    schedule 23.05.2013
comment
Можно, видимо. В Win32 есть API-интерфейс IpHelper, который предоставляет информацию о доступных сетях, поэтому вы можете выбрать те, которые выглядят достаточно локальными, а затем использовать DnsQuery для получения имен хостов. Использование ICMP для проверки связи не требуется.   -  person Valeri Atamaniouk    schedule 23.05.2013


Ответы (1)


Как объяснено в этом ответе, нужно пропинговать все хосты в вашей подсети и посмотреть, какие из них отвечают или обращаются к кешу ARP. Первый подход реализуется путем создания необработанного сокета с использованием

int sock = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP));

Однако необработанные сокеты в основном дают вам только IP-заголовок, поэтому вам нужно самостоятельно создать эхо-пакет ICMP. После того, как вы его создали, вы просто отправляете их на каждый IP-адрес в подсети, используя sendto(), и ждете ответа. Для второго подхода я предлагаю прочитать что-то вроде этого.

Что касается определения имен хостов, это зависит от того, имеют ли хосты имена DNS или NETBIOS. Если в вашей локальной сети настроен DNS, вам может сойти с рук вызов getaddrinfo() по адресам, которые отвечают. К сожалению, я понятия не имею, как узнать NETBIOS-имя любого заданного IP-адреса.

person kpaleniu    schedule 22.05.2013