#![feature(async_await)]
#![warn(rust_2018_idioms)]
use std::env;
use std::net::SocketAddr;
use tokio;
use tokio::codec::{BytesCodec, Decoder};
use tokio::net::TcpListener;
use tokio::prelude::*;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let addr = env::args().nth(1).unwrap_or("127.0.0.1:8080".to_string());
let addr = addr.parse::<SocketAddr>()?;
let mut listener = TcpListener::bind(&addr)?;
println!("Listening on: {}", addr);
loop {
let (socket, _) = listener.accept().await?;
tokio::spawn(async move {
let mut framed = BytesCodec::new().framed(socket);
while let Some(message) = framed.next().await {
match message {
Ok(bytes) => println!("bytes: {:?}", bytes),
Err(err) => println!("Socket closed with error: {:?}", err),
}
}
println!("Socket received FIN packet and closed connection");
});
}
}