地方エンジニアの学習日記

興味ある技術の雑なメモだったりを書いてくブログ。たまに日記とガジェット紹介。

【Rust】TCPのエコーサーバを書く

仕事で使うわけでは今のところないけど触ってみてる。コンパイルエラーが凄くてそれ通りに書いていくと動くというのが良かった。cargoコマンドも少ししか触っていないけど便利。マスコットキャラクターのカニが可愛い。

Linuxにも入っていてるらしいのでとても楽しみ。

ソースコード

AIが優秀というのもあるけど出てくるコード自体は理解がしやすくて書きやすかった。ただ所有権とか出てくる手前で多分ここから難しくなっていくんだろうなと思ったりした。 Firecrackerのコードを読めるくらいにはRustに慣れておきたいので読んで書いてをやっていく。

use std::net::{TcpListener, TcpStream};
use std::io::{Read, Write};
use std::thread;

fn handle_client(mut stream: TcpStream) {
    let mut buffer = [0; 512];

    loop {
        match stream.read(&mut buffer) {
            Ok(0) => {
                println!("Client disconnected");
                break;
            }
            Ok(n) => {
                println!("Received: {}", String::from_utf8_lossy(&buffer[..n]));
                if let Err(e) = stream.write_all(&buffer[..n]) {
                    eprintln!("Failed to send data: {}", e);
                    break;
                }
            }
            Err(e) => {
                eprintln!("Error reading from stream: {}", e);
                break;
            }
        }
    }
}

fn main() -> std::io::Result<()> {
    let listener = TcpListener::bind("127.0.0.1:8080")?;

    println!("Server running on 127.0.0.1:8080");

    for stream in listener.incoming() {
        match stream {
            Ok(stream) => {
                thread::spawn(move || handle_client(stream));
            }
            Err(e) => {
                eprintln!("Connection failed: {}", e);
            }
        }
    }

    Ok(())
}