Страницы

Поиск по вопросам

суббота, 11 января 2020 г.

Как просканировать сеть на наличие включенных компьютеров?

#cpp #linux #ip #lan


В локальных сетях есть компьютеры и у каждого из них есть свой IP адрес. Как узнать,
перебирая все IP, какие компьютеры покдлюченны в сеть. 

Я пробовал через комманду PING, получал от из нее ответ и проверял его:

string subNet = "192.168.1.";
for(int i = 1; i < 256; i++){
    string network_IP = subNet + to_string(i);
    string request = "ping " + network_IP + " -c 1 > /dev/null"; 
    string result = system(request.c_str()) == 0 ? "true" : "false";
    cout << network_IP << " available: " << result << endl;
}


но данная система работает очень долго, как можно это ускорить?
    


Ответы

Ответ 1



система работает очень долго она не работает. она ждёт ответа на ping-запрос. Если данный хост "живой", то ответ прилетает практически мгновенно. Если же хост не отвечает, то утилита ping ждёт таймаут. Величина этого таймаута задаётся ключиком "-W". Попробуйте задать "-W1" - посмотрите результат. как можно это ускорить? Насчёт таймаута я уже сказал. Но, это не радикальное средство. А радикальым решением будет написание двух функций: Отправить ICMP-запрос Ждать ответа на ICMP запрос. Тогда Вы в цикле отправляете запросы по всем адресам локальной сети - без(!) ожидания ответа. Внутри каждого отправленного ICMP запроса указываете его ID. После чего ждёте таймаут один(!) раз. Здесь цикл вызова второй вашей функции. Она принимает пакет и по ID определяет, от кого этот ответ пришёл. Всё это продолжается таймаут. Кто успел прислать ответ - тот живой. Кто не прислал - того нет в сети. Таким образом, таймаут отрабатывает только один раз. Есть ещё одна проблема: сисадмины, для предотвращения хакинга, часто запрещают хостам отправлять ответы на ICMP запросы. В качестве "рыбы" для написания этих двух функций рекомендую использовать простенький текст пользователя .failer на страничке https://forum.sources.ru/index.php?showtopic=57566

Комментариев нет:

Отправить комментарий