60 lines
1.4 KiB
Rust
60 lines
1.4 KiB
Rust
use std::{
|
|
io::{self, Write},
|
|
net::{SocketAddr, TcpStream},
|
|
sync::atomic::{AtomicU64, Ordering},
|
|
sync::Arc,
|
|
};
|
|
|
|
use clap::Parser;
|
|
|
|
#[derive(Debug, Parser)]
|
|
struct Args {
|
|
#[clap(default_value = "127.0.0.1:113")]
|
|
ip: SocketAddr,
|
|
|
|
#[clap(default_value = "20")]
|
|
threads: u64,
|
|
}
|
|
|
|
fn main() {
|
|
let cli = Args::parse();
|
|
|
|
let threads = cli.threads;
|
|
|
|
println!("Target: {}", cli.ip);
|
|
|
|
let send_count = Arc::new(AtomicU64::new(0));
|
|
|
|
for _ in 0..threads {
|
|
let send_count = Arc::clone(&send_count);
|
|
std::thread::spawn(move || loop {
|
|
match TcpStream::connect_timeout(&cli.ip, std::time::Duration::from_nanos(100)) {
|
|
Ok(_) => send_count.fetch_add(1, Ordering::Relaxed),
|
|
Err(_) => send_count.fetch_add(1, Ordering::Relaxed),
|
|
};
|
|
});
|
|
}
|
|
|
|
std::thread::spawn(move || {
|
|
let mut last_count = 0;
|
|
loop {
|
|
let send_count = send_count.load(Ordering::Relaxed);
|
|
print!(
|
|
"{} Packets sent. {}/sec",
|
|
send_count,
|
|
send_count - last_count
|
|
);
|
|
last_count = send_count;
|
|
io::stdout().flush().unwrap();
|
|
std::thread::sleep(std::time::Duration::from_secs(1));
|
|
print!("\r");
|
|
}
|
|
});
|
|
|
|
println!("{} Threads created.", threads);
|
|
|
|
loop {
|
|
std::thread::sleep(std::time::Duration::from_secs(1));
|
|
}
|
|
}
|