use std::io::{Read, Result, Write};
use std::net::SocketAddr;
use std::str::FromStr;
use stuck::{net, task};
fn echo(mut stream: net::TcpStream) -> Result<()> {
let mut buf = Vec::with_capacity(1024);
unsafe { buf.set_len(buf.capacity()) };
loop {
match stream.read(&mut buf)? {
0 => break,
n => stream.write_all(&buf[..n])?,
}
}
Ok(())
}
#[stuck::main]
fn main() -> Result<()> {
let addr = SocketAddr::from_str("127.0.0.1:0").unwrap();
let mut listener = net::TcpListener::bind(addr)?;
let port = listener.local_addr().unwrap().port();
eprintln!("Listen on port: {}", port);
let mut id_counter = 0;
while let Ok((stream, remote_addr)) = listener.accept() {
id_counter += 1;
let id = id_counter;
task::spawn(move || {
eprintln!("{:010}[{}]: serving", id, remote_addr);
match echo(stream) {
Ok(_) => eprintln!("{:010}[{}]: closed", id, remote_addr),
Err(err) => eprintln!("{:010}[{}]: {:?}", id, remote_addr, err),
}
});
}
Ok(())
}