Basic TCP echo server
Based on the example in the README of tokio.
Start with:
cargo run
From another terminal:
telnet localhost 8080
use tokio::io::{AsyncReadExt, AsyncWriteExt}; use tokio::net::TcpListener; /// Applies ROT13 transformation to a u8 slice. /// Only ASCII letters are rotated; other bytes are unchanged. pub fn rot13(input: &[u8]) -> Vec<u8> { input .iter() .map(|&b| match b { b'a'..=b'z' => (b - b'a' + 13) % 26 + b'a', b'A'..=b'Z' => (b - b'A' + 13) % 26 + b'A', _ => b, }) .collect() } #[tokio::main] async fn main() -> Result<(), Box<dyn std::error::Error>> { let listener = TcpListener::bind("127.0.0.1:8080").await?; loop { println!("Waiting for a connection..."); let (mut socket, _) = listener.accept().await?; tokio::spawn(async move { let mut buf = [0; 1024]; loop { println!("Getting data..."); let n = match socket.read(&mut buf).await { // socket closed Ok(0) => return, Ok(n) => n, Err(e) => { eprintln!("failed to read from socket; err = {:?}", e); return; } }; let received_text = String::from_utf8_lossy(&buf[0..n]); println!("Received text: {}", received_text); // Write the data back let encripted = rot13(&buf[0..n]); if let Err(e) = socket.write_all(&encripted[0..n]).await { eprintln!("failed to write to socket; err = {:?}", e); return; } } }); } }
[package]
name = "demo"
version = "0.1.0"
edition = "2024"
[dependencies]
tokio = { version = "1.47.1", features = ["full"] }