use std::net::SocketAddr;
use std::time::Duration;
use tokio::io::copy;
use tokio::net::{TcpListener, TcpStream};
use tokio_task_manager::{Task, TaskManager};
#[tokio::main]
async fn main() {
let tm = TaskManager::new(Duration::from_secs(10));
let listener = TcpListener::bind("127.0.0.1:4000").await.unwrap();
let mut task = tm.task();
tokio::spawn(async move {
loop {
let (stream, addr) = tokio::select! {
r = listener.accept() => match r {
Err(_) => continue,
Ok(s) => s,
},
_ = task.wait() => {
return;
}
};
let task = task.clone();
tokio::spawn(async move {
handle(task, stream, addr).await;
});
}
});
tm.shutdown_gracefully_on_ctrl_c().await;
}
async fn handle(_task: Task, mut stream: TcpStream, addr: SocketAddr) {
let (mut reader, mut writer) = stream.split();
match copy(&mut reader, &mut writer).await {
Ok(amt) => println!("handle: wrote {} bytes to {}", amt, addr),
Err(e) => println!("handle: error on {}: {}", addr, e),
};
}