Handle graceful shutdown by listening for OS signals and stopping the server loop before joining worker threads.
use std::net::TcpListener;
use std::sync::{Arc, Mutex};
use std::thread;
fn main() {
let listener = TcpListener::bind("127.0.0.1:7878").unwrap();
let shutdown = Arc::new(Mutex::new(false));
let shutdown_clone = shutdown.clone();
thread::spawn(move || {
ctrlc::set_handler(move || {
*shutdown_clone.lock().unwrap() = true;
}).unwrap();
});
for stream in listener.incoming() {
if *shutdown.lock().unwrap() {
break;
}
let _stream = stream.unwrap();
println!("Connection established!");
}
println!("Shutting down...");
}
Add ctrlc to your Cargo.toml dependencies to capture the interrupt signal.