diff options
Diffstat (limited to 'src/main.rs')
| -rw-r--r-- | src/main.rs | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..ad85a80 --- /dev/null +++ b/src/main.rs @@ -0,0 +1,51 @@ +// luwenpeng 2022/11/01 + +use futures::StreamExt; +use mini_rust_runtime::executor::Executor; +use mini_rust_runtime::tcp::TcpListener; +use tokio::io::AsyncReadExt; +use tokio::io::AsyncWriteExt; + +fn main() { + let excutor = Executor::new(); + + excutor.block_on(tcp_server); +} + +async fn tcp_server() { + let mut listener = TcpListener::bind("127.0.0.1:30000").unwrap(); + println!("[tcp_server] listen on: 127.0.0.1:30000"); + + // NOTE:listener.next() 其实是调用的 poll_next() + while let Some(ret) = listener.next().await { + if let Ok((mut stream, addr)) = ret { + println!("[tcp_server] accept new connection: {}", addr); + + // 此处只是注册,并不是此时执行 + let future = async move { + let mut buf = [0; 4096]; + loop { + match stream.read(&mut buf).await { + Ok(n) => { + println!("[tcp_server] stream {} read: {}", addr, n); + + if n == 0 || stream.write_all(&buf[..n]).await.is_err() { + println!("[tcp_server] stream {} write: {}", addr, n); + return; + } + } + Err(e) => { + println!("[tcp_server] stream {} read: {}", addr, e); + return; + } + } + } + }; + + // 将 future 封装成 task push 到任务队列中 + println!("[tcp_server] -> befor Executor::spawn()"); + Executor::spawn(future); + println!("[tcp_server] -> after Executor::spawn()"); + } + } +} |
