summaryrefslogtreecommitdiffstats
path: root/src/bin/server.rs
blob: 215d2ae5e525fb2499ea24e7a2792ba456158888 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
use std::io::{BufRead, BufReader, Write};
use std::net::TcpListener;
use std::thread;

fn handle_client(stream: std::net::TcpStream) {
    println!("Client connected");
    let reader_stream = stream.try_clone().unwrap();
    let reader = BufReader::new(reader_stream);
    let mut writer = stream;
    for line in reader.lines() {
        let line = line.unwrap();
        println!("Received: {}", line);
        writeln!(writer, "{}", line).unwrap();
    }
    println!("Client disconnected");
}

fn main() {
    let args: Vec<String> = std::env::args().collect();
    let mut ip = "127.0.0.1".to_string();
    let mut port = 8080;
    let mut i = 1;
    while i < args.len() {
        if args[i] == "-p" {
            if i + 1 < args.len() {
                port = args[i + 1].parse::<u16>().unwrap_or_else(|_| {
                    eprintln!("Invalid port number: {}", args[i + 1]);
                    std::process::exit(1);
                });
                i += 2;
            } else {
                eprintln!("-p requires a port number");
                std::process::exit(1);
            }
        } else if args[i] == "-i" {
            if i + 1 < args.len() {
                ip = args[i + 1].clone();
                if ip != "127.0.0.1" && ip != "0.0.0.0" {
                    eprintln!("Invalid IP address: {}. Must be 127.0.0.1 or 0.0.0.0", ip);
                    std::process::exit(1);
                }
                i += 2;
            } else {
                eprintln!("-i requires an IP address");
                std::process::exit(1);
            }
        } else {
            eprintln!("Unknown argument: {}", args[i]);
            std::process::exit(1);
        }
    }
    let listener = match TcpListener::bind(format!("{}:{}", ip, port)) {
        Ok(l) => l,
        Err(e) => {
            eprintln!("Failed to bind to {}:{}: {}", ip, port, e);
            std::process::exit(1);
        }
    };
    println!("Server listening on {}", listener.local_addr().unwrap());
    for stream in listener.incoming() {
        let stream = stream.unwrap();
        thread::spawn(move || {
            handle_client(stream);
        });
    }
}