1
- use std:: thread;
2
- use std:: sync:: mpsc;
3
- use std:: net:: { IpAddr , Ipv4Addr , Ipv6Addr , SocketAddr } ;
4
- use std:: net:: { TcpListener , TcpStream , Shutdown } ;
5
1
use std:: io:: prelude:: * ;
2
+ use std:: net:: { IpAddr , Ipv4Addr , Ipv6Addr , SocketAddr } ;
3
+ use std:: net:: { Shutdown , TcpListener , TcpStream } ;
4
+ use std:: sync:: mpsc;
5
+ use std:: thread;
6
6
use std:: time:: Duration ;
7
7
8
8
const BUFFER_SIZE : usize = 1024 * 2 ;
9
9
10
-
11
10
pub fn start ( client_socket : SocketAddr , remote_socket : SocketAddr ) {
12
11
let listener = TcpListener :: bind ( client_socket) . unwrap_or_else ( |err| {
13
12
println ! ( "Failed to start listener." ) ;
@@ -20,83 +19,83 @@ pub fn start(client_socket: SocketAddr, remote_socket: SocketAddr) {
20
19
Ok ( stream) => {
21
20
thread:: spawn ( move || handle_client ( stream, remote_socket) ) ;
22
21
}
23
-
24
22
}
25
23
}
26
24
}
27
25
28
26
fn handle_client ( mut stream : TcpStream , remote_socket : SocketAddr ) {
29
-
30
27
let ( forward_tx, forward_rx) = mpsc:: channel ( ) ;
31
28
let ( backward_tx, backward_rx) = mpsc:: channel ( ) ;
32
29
33
- // stream.set_read_timeout(None).expect("set_read_timeout call failed");
34
- // stream.set_write_timeout(None).expect("set_read_timeout call failed");
35
30
let mut cl_stream = stream;
36
- let mut lc_stream = cl_stream. try_clone ( ) . expect ( "Failed to clone client stream" ) ;
31
+ let mut lc_stream = cl_stream
32
+ . try_clone ( )
33
+ . expect ( "Failed to clone client stream" ) ;
37
34
38
- let mut lr_stream = TcpStream :: connect ( remote_socket) . expect ( "Failed to connect to remote host" ) ;
39
- // lr_stream.set_read_timeout(None).expect("set_read_timeout call failed");
40
- // lr_stream.set_write_timeout(None).expect("set_read_timeout call failed");
41
- let mut rl_stream = lr_stream. try_clone ( ) . expect ( "Failed to clone remote stream" ) ;
35
+ let mut lr_stream =
36
+ TcpStream :: connect ( remote_socket) . expect ( "Failed to connect to remote host" ) ;
37
+ let mut rl_stream = lr_stream
38
+ . try_clone ( )
39
+ . expect ( "Failed to clone remote stream" ) ;
42
40
43
-
44
- thread :: spawn ( move || { // client -> local
45
- let mut data = [ 0 as u8 ; BUFFER_SIZE ] ; // using 2048 byte buffer
41
+ thread :: spawn ( move || {
42
+ // client -> local
43
+ let mut data = [ 0 as u8 ; BUFFER_SIZE ] ; // using 2048 byte buffer
46
44
loop {
47
45
match cl_stream. read ( & mut data) {
48
46
Ok ( size) => {
49
- if let Err ( _) = forward_tx. send ( ( data, size) ) { break }
47
+ if let Err ( _) = forward_tx. send ( ( data, size) ) {
48
+ break ;
49
+ }
50
50
if size == 0 {
51
- // thread::sleep(Duration::from_millis(1));
52
- break
51
+ break ;
53
52
}
54
- } ,
53
+ }
55
54
Err ( e) => {
56
55
forward_tx. send ( ( data, 0 ) ) . unwrap ( ) ;
57
- // println!("Failed to read from client, {}", e);
58
- break
56
+ break ;
59
57
}
60
58
}
61
59
}
62
- cl_stream. shutdown ( Shutdown :: Read ) ;
60
+ cl_stream. shutdown ( Shutdown :: Read ) ;
63
61
} ) ;
64
62
65
- thread:: spawn ( move || { // local -> remote
63
+ thread:: spawn ( move || {
64
+ // local -> remote
66
65
loop {
67
66
if let Ok ( ( mut data, size) ) = forward_rx. recv ( ) {
68
67
if size == 0 {
69
- break
68
+ break ;
70
69
}
71
70
if let Err ( _) = lr_stream. write ( & mut data[ ..size] ) {
72
- break
71
+ break ;
73
72
}
74
73
} else {
75
- break
74
+ break ;
76
75
}
77
-
78
76
}
79
77
lr_stream. shutdown ( Shutdown :: Write ) ;
80
- return
78
+ return ;
81
79
} ) ;
82
80
83
- thread:: spawn ( move || { // remote -> local
81
+ thread:: spawn ( move || {
82
+ // remote -> local
84
83
let mut data = [ 0 as u8 ; BUFFER_SIZE ] ;
85
84
loop {
86
85
match rl_stream. read ( & mut data) {
87
86
Ok ( size) => {
88
- if let Err ( _) = backward_tx. send ( ( data, size) ) { break }
87
+ if let Err ( _) = backward_tx. send ( ( data, size) ) {
88
+ break ;
89
+ }
89
90
if size == 0 {
90
- // thread::sleep(Duration::from_millis(1));
91
- break
91
+ break ;
92
92
}
93
- } ,
93
+ }
94
94
Err ( e) => {
95
95
backward_tx. send ( ( data, 0 ) ) . unwrap ( ) ;
96
- // println!("Failed to read from remote, {}", e);
97
- break
96
+ break ;
98
97
}
99
- }
98
+ }
100
99
}
101
100
rl_stream. shutdown ( Shutdown :: Read ) ;
102
101
} ) ;
@@ -105,20 +104,15 @@ fn handle_client(mut stream: TcpStream, remote_socket: SocketAddr) {
105
104
loop {
106
105
if let Ok ( ( mut data, size) ) = backward_rx. recv ( ) {
107
106
if size == 0 {
108
- break
107
+ break ;
109
108
}
110
109
if let Err ( _) = lc_stream. write ( & mut data[ ..size] ) {
111
- break
110
+ break ;
112
111
}
113
112
} else {
114
- break
113
+ break ;
115
114
}
116
-
117
115
}
118
- lc_stream. shutdown ( Shutdown :: Write ) ;
119
- return
116
+ lc_stream. shutdown ( Shutdown :: Write ) ;
117
+ return ;
120
118
}
121
-
122
-
123
-
124
-
0 commit comments