{"id":1445,"date":"2025-06-23T16:24:32","date_gmt":"2025-06-23T16:24:32","guid":{"rendered":"https:\/\/robinluo.top\/?p=1445"},"modified":"2025-07-08T15:04:48","modified_gmt":"2025-07-08T15:04:48","slug":"rust-%e7%bd%91%e7%bb%9c%e7%bc%96%e7%a8%8b","status":"publish","type":"post","link":"https:\/\/robinluo.top\/?p=1445","title":{"rendered":"Rust \u7f51\u7edc\u7f16\u7a0b"},"content":{"rendered":"\n<p>\u670d\u52a1\u7aef\u4ee3\u7801\uff1asocket\u963b\u585e\u5faa\u73af\u8bfb<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>use std::io::{Read, Write};\r\nuse std::net::{TcpListener\uff0cTcpStream};\r\nuse std::thread;\r\n\r\nfn handle_client(mut stream: TcpStream) {\r\n    let mut buffer = &#91;0; 1024];\r\n\r\n    loop {\r\n        match stream.read(&amp;mut buffer) {\r\n            Ok(0) => {\r\n                \/\/ \u5ba2\u6237\u7aef\u5173\u95ed\u8fde\u63a5\r\n                println!(\"Client disconnected\");\r\n                break;\r\n            }\r\n            Ok(size) => {\r\n                \/\/ \u8bfb\u53d6\u5230\u6570\u636e\uff0c\u56de\u663e\u7ed9\u5ba2\u6237\u7aef\r\n                let data = &amp;buffer&#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; buffer&#91;0] == 255 &amp;&amp; buffer&#91;1] == 244 {\r\n                    println!(\"Detected telnet disconnect command (IAC IP)\");\r\n                    if let Err(e) = stream.shutdown(std::net::Shutdown::Both) {\r\n                        println!(\"Error shutting down stream: {}\", e);\r\n                    }\r\n                    break;\r\n                }\r\n                \r\n                \/\/ \u68c0\u67e5\u666e\u901aASCII\u7684CTRL+C (3)\r\n                if buffer&#91;..size].contains(&amp;3) {\r\n                    println!(\"Detected CTRL+C, closing connection\");\r\n                    if let Err(e) = stream.shutdown(std::net::Shutdown::Both) {\r\n                        println!(\"Error shutting down stream: {}\", e);\r\n                    }\r\n                    break;\r\n                }\r\n\r\n                 if let Err(e) = stream.write_all(&amp;buffer&#91;..size]) {\r\n                    println!(\"Error writing to stream: {}\", e);\r\n                    break;\r\n                }\r\n            }\r\n            Err(e) => {\r\n                \/\/ \u53d1\u751f\u9519\u8bef\uff0c\u5173\u95ed\u8fde\u63a5\r\n                println!(\"Error: {}\", e);\r\n                break;\r\n            }\r\n        }\r\n    }\r\n}\r\n\r\nfn main() {\r\n    let listener = TcpListener::bind(\"127.0.0.1:65432\").unwrap();\r\n    println!(\"Server listening on 127.0.0.1:65432\");\r\n\r\n    for stream in listener.incoming() {\r\n        match stream {\r\n            Ok(stream) => {\r\n                \/\/ \u4e3a\u6bcf\u4e2a\u5ba2\u6237\u7aef\u8fde\u63a5\u521b\u5efa\u4e00\u4e2a\u65b0\u7ebf\u7a0b\r\n                thread::spawn(move || {\r\n                    handle_client(stream);\r\n                });\r\n            }\r\n            Err(e) => {\r\n                println!(\"Error accepting stream: {}\", e);\r\n                break;\r\n            }\r\n        }\r\n    }\r\n\r\n    \/\/ \u6ce8\u610f\uff1a\u5728\u5b9e\u9645\u5e94\u7528\u4e2d\uff0c\u5e94\u8be5\u4f18\u96c5\u5730\u5173\u95ed\u76d1\u542c\u5668\uff0c\u6bd4\u5982\u76d1\u542c\u4e00\u4e2a\u5173\u95ed\u4fe1\u53f7\u3002\r\n    \/\/ \u8fd9\u91cc\u4e3a\u4e86\u7b80\u5316\uff0c\u76f4\u63a5\u9000\u51fa\u4e3b\u5faa\u73af\u540e\u7a0b\u5e8f\u5c06\u7ed3\u675f\u3002\r\n}<\/code><\/pre>\n\n\n\n<p>client \u7aef\u4ee3\u7801<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>use std::io::{self, Read, Write};\r\nuse std::net::TcpStream;\r\n\r\nfn main() -> io::Result&lt;()> {\r\n    let mut stream = TcpStream::connect(\"127.0.0.1:65432\")?;\r\n    println!(\"Connected to server!\");\r\n    \r\n    loop {\r\n        let mut input = String::new();\r\n        io::stdin().read_line(&amp;mut input)?;\r\n        \r\n        if input.contains('\\x03') { \/\/ CTRL+C\r\n            println!(\"Sending CTRL+C to server\");\r\n            stream.write_all(input.as_bytes())?;\r\n            break;\r\n        }\r\n        \r\n        stream.write_all(input.as_bytes())?;\r\n        \r\n        let mut buffer = &#91;0; 1024];\r\n        let size = stream.read(&amp;mut buffer)?;\r\n        if size == 0 {\r\n            println!(\"Server closed connection\");\r\n            break;\r\n        }\r\n        \r\n        println!(\"Server echo: {}\", String::from_utf8_lossy(&amp;buffer&#91;..size]));\r\n    }\r\n    \r\n    Ok(())\r\n}<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>\u670d\u52a1\u7aef\u4ee3\u7801\uff1asocket\u963b\u585e\u5faa\u73af\u8bfb client \u7aef\u4ee3\u7801<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[225],"tags":[224,228],"_links":{"self":[{"href":"https:\/\/robinluo.top\/index.php?rest_route=\/wp\/v2\/posts\/1445"}],"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=1445"}],"version-history":[{"count":2,"href":"https:\/\/robinluo.top\/index.php?rest_route=\/wp\/v2\/posts\/1445\/revisions"}],"predecessor-version":[{"id":1460,"href":"https:\/\/robinluo.top\/index.php?rest_route=\/wp\/v2\/posts\/1445\/revisions\/1460"}],"wp:attachment":[{"href":"https:\/\/robinluo.top\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1445"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/robinluo.top\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1445"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/robinluo.top\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1445"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}