appsec/src/bin/server.rs

54 lines
1.6 KiB
Rust
Raw Normal View History

use std::{
2022-11-17 23:45:29 +01:00
io::{prelude::*, BufReader, Lines},
net::{TcpListener, TcpStream},
};
2022-11-17 23:45:29 +01:00
use std::thread::available_parallelism;
use crate::thread_pool::ThreadPool;
mod thread_pool;
2022-11-17 11:14:34 +01:00
fn main() {
2022-11-17 23:45:29 +01:00
// start server on localhost (for remote access use: 0.0.0.0)
let listener = TcpListener::bind("127.0.0.1:7878").unwrap();
2022-11-17 23:45:29 +01:00
// create thread pool (size = no. of cpu cores)
let pool = ThreadPool::new(available_parallelism().unwrap().get());
2022-11-17 23:45:29 +01:00
// handling function for incoming requests
for stream in listener.incoming() {
let stream = stream.unwrap();
2022-11-17 23:45:29 +01:00
// pass request to thread pool
pool.execute(|| {
handle_connection(stream);
});
}
2022-11-17 23:45:29 +01:00
println!("Shutting down.");
}
2022-11-17 23:45:29 +01:00
fn handle_connection(mut stream: TcpStream) {
2022-11-17 23:45:29 +01:00
// clone TcpStream for simultaneous receiving and sending
let mut stream2: TcpStream = stream.try_clone().unwrap();
2022-11-17 23:45:29 +01:00
// initialize reading buffer (for better performance!)
let buf_reader: BufReader<&mut TcpStream> = BufReader::new(&mut stream);
2022-11-17 23:45:29 +01:00
// request: read received text line by line (continuous until connection closed)
let request: Lines<BufReader<&mut TcpStream>> = buf_reader.lines();
println!("Request: {:#?}", request);
2022-11-17 23:45:29 +01:00
// processing function for every text line received by request (terminates when conn closed)
for elem in request
{
2022-11-17 23:45:29 +01:00
// store received line in variable s
let s = elem.unwrap();
println!("{:?}", s);
2022-11-17 23:45:29 +01:00
// send received line back to sender (append LF)
stream2.write_all(s.as_bytes()).unwrap();
stream2.write_all(b"\n").unwrap();
}
2022-11-17 11:14:34 +01:00
}