summaryrefslogtreecommitdiff
path: root/src/main.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/main.rs')
-rw-r--r--src/main.rs51
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()");
+ }
+ }
+}