-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathclient_server.rs
74 lines (60 loc) · 2.43 KB
/
client_server.rs
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
67
68
69
70
71
72
73
74
use std::{net::{TcpStream, TcpListener}, mem::MaybeUninit, thread};
use std::io::Write;
use env_logger::Builder;
use simple_parse::{SpRead, SpWrite};
#[derive(SpRead, SpWrite)]
pub enum Message {
Ping,
Pong,
Chat(String),
Key {
private: Vec<u8>,
public: Vec<u8>,
},
Disconnect,
}
pub fn main() {
let mut builder = Builder::from_default_env();
builder
.format(|buf, record| writeln!(buf, "[{}] {}", record.level(), record.args()))
.init();
let listener = TcpListener::bind("127.0.0.1:0").expect("[server] Failed to bind");
let port = listener.local_addr().unwrap().port();
// Spawn a "client"
let t1 = thread::spawn(move || client_thread(port));
let mut dst = MaybeUninit::uninit();
let mut sock = listener.accept().expect("[server] Failed to accept connection").0;
loop {
// Receive & parse bytes from the socket as a `Message` using SpRead
let msg = Message::from_reader(&mut sock, &mut dst).expect("[server] Failed to receive message");
match msg {
Message::Ping => {
println!("[server] Got Ping ! Sending Pong...");
// Respond with a Pong using SpWrite
(Message::Pong).to_writer(&mut sock).expect("[server] Failed to send Pong");
},
Message::Pong => println!("[server] got pong !"),
Message::Chat(s) => println!("[server] Received chat : '{s}'"),
Message::Key{private, public} => println!("[server] got keys : {private:X?}:{public:X?}"),
Message::Disconnect => break,
}
}
t1.join().unwrap();
}
fn client_thread(port: u16) {
let mut sock = TcpStream::connect(&format!("127.0.0.1:{port}")).expect("Failed to connect");
println!("[client] Sending Ping !");
Message::Ping.to_writer(&mut sock).expect("[client] Failed to send Ping");
// Wait for the pong
let mut dst = MaybeUninit::uninit();
let msg = Message::from_reader(&mut sock, &mut dst).expect("[client] Failed to recv Pong");
if !matches!(msg, Message::Pong) {
panic!("[client] Server did not send a pong ?!");
}
println!("[client] Got Pong !");
// Send a chat !
let msg = Message::Chat("Hello from client !!".to_string());
msg.to_writer(&mut sock).expect("[client] Failed to send Chat");
// Disconnect
Message::Disconnect.to_writer(&mut sock).expect("[client] Failed to send Disconnect");
}