Skip to content

Commit 98c3641

Browse files
committed
Non-blocking TCP logic, option 1
1 parent d484f7c commit 98c3641

File tree

1 file changed

+59
-8
lines changed

1 file changed

+59
-8
lines changed

src/tcp.rs

Lines changed: 59 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,67 @@
1+
use std::io::ErrorKind::WouldBlock;
2+
use std::sync::{Arc, Mutex};
3+
use std::time::Duration;
4+
15
use byteorder::{BigEndian, ByteOrder};
26
use std::io::prelude::*;
3-
use std::net::TcpListener;
4-
use std::net::TcpStream;
7+
use std::net::{TcpListener, TcpStream};
58
use std::str;
9+
use std::thread;
10+
11+
fn bind(connections: Arc<Mutex<Vec<TcpStream>>>) {
12+
thread::spawn(move || {
13+
let listener = TcpListener::bind("127.0.0.1:2593").unwrap();
14+
15+
for stream in listener.incoming() {
16+
let mut connections = connections.lock().unwrap();
17+
let stream = stream.unwrap();
18+
let addr = stream.peer_addr().unwrap();
19+
stream
20+
.set_read_timeout(Some(Duration::from_nanos(1)))
21+
.expect("set_read_timeout call failed");
22+
println!("Connection received from: {}", addr);
23+
connections.push(stream);
24+
}
25+
});
26+
}
627

728
pub fn start() {
8-
let listener = TcpListener::bind("127.0.0.1:2593").unwrap();
9-
for stream in listener.incoming() {
10-
let mut stream = stream.unwrap();
11-
let mut buffer = [0; 1024];
12-
stream.read(&mut buffer).unwrap();
13-
parse_packets(buffer, &mut stream);
29+
let connections: Vec<TcpStream> = vec![];
30+
31+
let connections = Arc::new(Mutex::new(connections));
32+
33+
bind(Arc::clone(&connections));
34+
35+
loop {
36+
thread::sleep(Duration::from_millis(1));
37+
38+
let mut connections = connections.lock().unwrap();
39+
40+
let mut next_connections = vec![];
41+
42+
while let Some(mut stream) = connections.pop() {
43+
let mut buffer = [0; 1024];
44+
45+
let received = stream.read(&mut buffer);
46+
47+
match received {
48+
Ok(num_bytes_read) => {
49+
if num_bytes_read == 0 {
50+
let addr = stream.peer_addr().unwrap();
51+
println!("Connection closed by: {}", addr);
52+
} else {
53+
parse_packets(buffer, &mut stream);
54+
next_connections.push(stream);
55+
}
56+
}
57+
Err(e) => match e.kind() {
58+
WouldBlock => next_connections.push(stream),
59+
_ => println!("Unexpected error from stream.read(): {:?}", e),
60+
},
61+
}
62+
}
63+
64+
*connections = next_connections;
1465
}
1566
}
1667

0 commit comments

Comments
 (0)