@MisterRobotsk

Я написал свой сканер портов на языке Rust при помощи библиотеки std::net. Почему у меня зависает программа если ввести другое значение?

Например если я изменю значение переменной my_host на 192.168.1.0 или на любой другой адрес, то программа просто перестанет отвечать как исправить данную проблему в приведенном коде ниже:
use std::net::TcpStream;

fn tcp_scan(host: String){
    for port in 1..1024{
        let mut ip = String::from(&host);
        ip.push_str(":");
        ip.push_str(&port.to_string());

        if let Ok(_) = TcpStream::connect(&ip){
            println!("This {} port is open", ip);
        } else {
            continue;
        }
    }
}

fn main(){
    let my_host = String::from("192.168.1.0");
    tcp_scan(my_host);
}
  • Вопрос задан
  • 143 просмотра
Пригласить эксперта
Ответы на вопрос 2
mayton2019
@mayton2019
Bigdata Engineer
Несколько мыслей. Первое. Скорее всего утилита зависает здесь
TcpStream::connect(&ip)
но ты должен это сам проверить и доказать во время подачи вопроса в хабр. Логгированием или профилированием неважно. Короче приходи - чуть более подготовленным чем просто с зависающей программой.

Второе. Сам по себе TCP протокол не бесплатный. Каждый новый сокет аллоцирует память в виде буфера
для отработки опций протокола (восстановление стрима с учетом потерянных пакетов) и этот буфер
где-то регулируется. Поищи. Проверь также скорость работы твоего приложения. Как быстро он отрабатывает
ответ от молчаливых портов которые ничего не отвечают. Это - тоже протокольная ситуация и ее надо как-то
обработать. Грубо говоря не доверять дефолтным таймингам.

Третье. Возможно некоторые промышленные утилиты-сканеры такие как nmap не используют создание
сокетов
. Они могут работать на уровне IP протокола просто посылая SYN-пакеты и обрабатывая ответы
асинхронно. Это такая хитрость которая позволяет создать сокет без буфера. Это не честно с точки
зрения полноценного протокола но достаточно чтобы проверить что ACK пришел. Вот почитай какие
возможности у RUST есть в части IP-программирования.
Ответ написан
@northernwind
"Скорее всего утилита зависает здесь" - правильно ответили, но она не зависает....

По IP, которые действительно есть в моей сети определяет открытые порты быстро, а на IP которые не резолвятся - висит. На самом деле, ничего не зависло, работа идет, но на хосты, которые не резолвятся уходит больше времени на попытки коннекта, поэтому кажется что "висит". Что бы это проверить - добавьте вывод перед continue и все станет понятно:
} else {
            println!("Could't connect to {}", ip);
            continue;
        }
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы