{"id":1461,"date":"2025-07-08T15:41:34","date_gmt":"2025-07-08T15:41:34","guid":{"rendered":"https:\/\/robinluo.top\/?p=1461"},"modified":"2025-07-08T16:56:09","modified_gmt":"2025-07-08T16:56:09","slug":"rust-%e5%bc%82%e6%ad%a5%e7%bc%96%e7%a8%8b","status":"publish","type":"post","link":"https:\/\/robinluo.top\/?p=1461","title":{"rendered":"Rust \u5f02\u6b65\u7f16\u7a0b"},"content":{"rendered":"\n<p>\u7b2c\u4e00\u6b65 \u5b89\u88c5tokio\u5e93<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>cargo add tokio --features full<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>use tokio::io::{AsyncReadExt, AsyncWriteExt};\r\nuse tokio::net::{TcpListener, TcpStream};\r\nuse std::error::Error;\r\n\r\n#&#91;tokio::main]\r\nasync fn main() -> Result&lt;(), Box&lt;dyn Error>> {\r\n    \/\/ \u7ed1\u5b9a\u5230\u672c\u5730\u5730\u5740\u76848080\u7aef\u53e3\r\n    let listener = TcpListener::bind(\"127.0.0.1:8080\").await?;\r\n    println!(\"\u670d\u52a1\u5668\u6b63\u5728\u76d1\u542c 127.0.0.1:8080\");\r\n\r\n    loop {\r\n        \/\/ \u7b49\u5f85\u65b0\u7684\u8fde\u63a5\r\n        let (socket, addr) = listener.accept().await?;\r\n        println!(\"\u63a5\u6536\u5230\u6765\u81ea {} \u7684\u65b0\u8fde\u63a5\", addr);\r\n\r\n        \/\/ \u4e3a\u6bcf\u4e2a\u8fde\u63a5\u751f\u6210\u4e00\u4e2a\u65b0\u4efb\u52a1\r\n        tokio::spawn(async move {\r\n            if let Err(e) = handle_connection(socket).await {\r\n                println!(\"\u5904\u7406\u8fde\u63a5\u65f6\u51fa\u9519: {}\", e);\r\n            }\r\n        });\r\n    }\r\n}\r\n\r\nasync fn handle_connection(mut socket: TcpStream) -> Result&lt;(), Box&lt;dyn Error>> {\r\n    \/\/ \u521b\u5efa\u4e00\u4e2a\u7f13\u51b2\u533a\u6765\u5b58\u50a8\u6570\u636e\r\n    let mut buf = &#91;0; 1024];\r\n\r\n    loop {\r\n        \/\/ \u8bfb\u53d6\u6570\u636e\r\n        let size = match socket.read(&amp;mut buf).await {\r\n            \/\/ \u5ba2\u6237\u7aef\u5173\u95ed\u4e86\u8fde\u63a5\r\n            Ok(size) if size == 0 => return Ok(()),\r\n            Ok(size) => size,\r\n            Err(e) => {\r\n                return Err(e.into());\r\n            }\r\n        };\r\n\r\n        let data = &amp;buf&#91;..size];\r\n        let received = String::from_utf8_lossy(data);\r\n        println!(\"Received data: {}\", received);\r\n        \/\/ \u68c0\u67e5\u662f\u5426\u662ftelnet\u7684\u65ad\u5f00\u547d\u4ee4\uff08IAC IP\uff09\r\n        if size >= 3 &amp;&amp; buf&#91;0] == 255 &amp;&amp; buf&#91;1] == 244 {\r\n            println!(\"Detected telnet disconnect command (IAC IP)\");\r\n             \/\/\u663e\u793a\u5173\u95ed\u8fde\u63a5\u5e76\u4e14\u4f20\u64ad\u5f02\u5e38\r\n            socket.shutdown().await?;\r\n            \/\/\u8fd9\u4e2a\u4e5f\u80fd\u9000\u51fa\u4e8b\u4ef6\u5faa\u73af \u5173\u95ed\u8fde\u63a5\r\n            return Ok(());\r\n        }\r\n        \r\n        \/\/ \u68c0\u67e5\u666e\u901aASCII\u7684CTRL+C (3)\r\n        if buf&#91;..size].contains(&amp;3) {\r\n            println!(\"Detected CTRL+C, closing connection\");\r\n            \/\/\u663e\u793a\u5173\u95ed\u8fde\u63a5\u5e76\u4e14\u4f20\u64ad\u5f02\u5e38\r\n            socket.shutdown().await?;\r\n            \/\/\u8fd9\u4e2a\u4e5f\u80fd\u9000\u51fa\u4e8b\u4ef6\u5faa\u73af \u5173\u95ed\u8fde\u63a5\r\n            return Ok(());\r\n        }\r\n\r\n        println!(\"\u63a5\u6536\u5230 {} \u5b57\u8282\u6570\u636e\", size);\r\n\r\n        \/\/ \u5c06\u6570\u636e\u5199\u56de\u5ba2\u6237\u7aef\r\n        if let Err(e) = socket.write_all(&amp;buf&#91;0..size]).await {\r\n            return Err(e.into());\r\n        }\r\n    }\r\n}<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>\u7b2c\u4e00\u6b65 \u5b89\u88c5tokio\u5e93<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[225],"tags":[114,224,228],"_links":{"self":[{"href":"https:\/\/robinluo.top\/index.php?rest_route=\/wp\/v2\/posts\/1461"}],"collection":[{"href":"https:\/\/robinluo.top\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/robinluo.top\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/robinluo.top\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/robinluo.top\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1461"}],"version-history":[{"count":4,"href":"https:\/\/robinluo.top\/index.php?rest_route=\/wp\/v2\/posts\/1461\/revisions"}],"predecessor-version":[{"id":1465,"href":"https:\/\/robinluo.top\/index.php?rest_route=\/wp\/v2\/posts\/1461\/revisions\/1465"}],"wp:attachment":[{"href":"https:\/\/robinluo.top\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1461"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/robinluo.top\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1461"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/robinluo.top\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1461"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}