Skip to content

Commit 51d7d20

Browse files
committed
setup the sniffer
1 parent 21782e4 commit 51d7d20

File tree

5 files changed

+136
-0
lines changed

5 files changed

+136
-0
lines changed

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
/target

Cargo.lock

+7
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
[package]
2+
name = "ip_sniffer"
3+
version = "0.1.0"
4+
edition = "2021"
5+
6+
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
7+
8+
[dependencies]

src/lib.rs

+54
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
use std::net::IpAddr;
2+
use std::str::FromStr;
3+
4+
pub struct Arguments {
5+
pub flag: String,
6+
pub ipaddr: IpAddr,
7+
pub threads: u16,
8+
}
9+
10+
mod utils {}
11+
12+
impl Arguments {
13+
pub fn new(args: &[String]) -> std::result::Result<Arguments, &'static str> {
14+
if args.len() < 2 {
15+
return Err("Not enough arguments");
16+
} else if args.len() > 4 {
17+
return Err("Too many arguments");
18+
}
19+
20+
let f = &args[1];
21+
if let Ok(ipaddr) = IpAddr::from_str(&f) {
22+
return Ok(Arguments {
23+
flag: String::from(""),
24+
ipaddr,
25+
threads: 4,
26+
});
27+
} else {
28+
let flag = &args[1];
29+
if flag.contains("-h") || flag.contains("-help") && args.len() == 2 {
30+
println!(
31+
"Usage: -j to select how many threads you want
32+
\r\n -h or -help to show this help message"
33+
);
34+
return Err("too many arguments");
35+
} else if flag.contains("-j") {
36+
let ipaddr = match IpAddr::from_str(&args[3]) {
37+
Ok(s) => s,
38+
Err(_) => return Err("Not a valid ip address; must be IPV4 or IPV6"),
39+
};
40+
let threads = match args[2].parse::<u16>() {
41+
Ok(s) => s,
42+
Err(_) => return Err("failed to parse thread number"),
43+
};
44+
return Ok(Arguments {
45+
threads,
46+
flag: flag.to_string(), // Convert `&String` to `String`
47+
ipaddr,
48+
});
49+
} else {
50+
return Err("invalid syntax");
51+
}
52+
}
53+
}
54+
}

src/main.rs

+66
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
use std::env;
2+
use std::io::{self, Write};
3+
use std::net::{IpAddr, TcpStream};
4+
use std::process;
5+
use std::sync::mpsc::{channel, Sender};
6+
use std::thread;
7+
8+
mod lib;
9+
10+
use lib::Arguments;
11+
12+
const MAX: u16 = 65535;
13+
14+
fn scan(tx: Sender<u16>, start_port: u16, addr: IpAddr, num_threads: u16) {
15+
let mut port = start_port + 1;
16+
loop {
17+
match TcpStream::connect((addr, port)) {
18+
Ok(_) => {
19+
print!(".");
20+
io::stdout().flush().unwrap();
21+
tx.send(port).unwrap();
22+
}
23+
Err(_) => {}
24+
}
25+
if (MAX - port) <= num_threads {
26+
break;
27+
}
28+
port += num_threads;
29+
}
30+
}
31+
32+
fn main() {
33+
let args: Vec<String> = env::args().collect();
34+
let program = &args[0];
35+
36+
let arguments = Arguments::new(&args).unwrap_or_else(|err| {
37+
if err.contains("help") {
38+
process::exit(0);
39+
} else {
40+
eprintln!("{} problem parsing arguments: {}", program, err);
41+
process::exit(0);
42+
}
43+
});
44+
45+
let num_threads = arguments.threads;
46+
let addr = arguments.ipaddr;
47+
let (tx, rx) = channel();
48+
for i in 0..num_threads {
49+
let tx = tx.clone();
50+
51+
// thread::spawn(move || scan(tx, i, arguments.ipaddr, num_threads));
52+
thread::spawn(move || scan(tx, i, addr, num_threads));
53+
}
54+
55+
let mut out = vec![];
56+
drop(tx);
57+
for p in rx {
58+
out.push(p);
59+
}
60+
61+
println!("");
62+
out.sort();
63+
for v in out {
64+
println!("{} is open", v);
65+
}
66+
}

0 commit comments

Comments
 (0)