Skip to content

Commit 7c4385a

Browse files
committed
Add rust-echo-server
1 parent 8f088de commit 7c4385a

File tree

3 files changed

+62
-0
lines changed

3 files changed

+62
-0
lines changed

rust-echo-server/Cargo.lock

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

rust-echo-server/Cargo.toml

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
[package]
2+
name = "rust-echo-server"
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]

rust-echo-server/src/main.rs

+47
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
use std::io::{self, BufRead, BufReader, Read, Write};
2+
use std::net::{TcpListener, TcpStream};
3+
use std::thread;
4+
5+
const MAX_READ_SIZE: u64 = 1024 * 1024;
6+
7+
fn handle_client(client: TcpStream) -> io::Result<()> {
8+
let mut reader = BufReader::new(&client);
9+
let mut buffer = String::new();
10+
11+
loop {
12+
// read
13+
buffer.clear();
14+
let n = (&mut reader).take(MAX_READ_SIZE).read_line(&mut buffer)?;
15+
if n == 0 {
16+
return Ok(());
17+
}
18+
19+
// write
20+
(&client).write_all(buffer.as_bytes())?;
21+
}
22+
}
23+
24+
fn main() -> io::Result<()> {
25+
let listener = TcpListener::bind("[::]:3000")?;
26+
eprintln!("server started on port 3000");
27+
28+
for stream in listener.incoming() {
29+
let stream = match stream {
30+
Ok(x) => x,
31+
Err(e) => {
32+
eprintln!("failed to accept connection: {e}");
33+
continue;
34+
}
35+
};
36+
37+
thread::spawn(move || {
38+
eprintln!("connection accepted");
39+
if let Err(e) = handle_client(stream) {
40+
eprintln!("failed to handle client: {e}");
41+
return;
42+
}
43+
eprintln!("connection done");
44+
});
45+
}
46+
Ok(())
47+
}

0 commit comments

Comments
 (0)