#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
Комментариев нет:
Отправить комментарий