1- use tokio:: io:: { AsyncReadExt , AsyncWriteExt } ;
1+ use tokio:: io:: { AsyncRead , AsyncReadExt , AsyncWrite , AsyncWriteExt } ;
22
3- const BUFFER_SIZE : usize = 8 * 1024 ;
3+ const BUFFER_SIZE : usize = 16 * 1024 ;
44
5- pub async fn exchange_tcp (
6- a : & mut tuic_quinn:: Connect ,
7- b : & mut tokio:: net:: TcpStream ,
8- ) -> ( usize , usize , Option < eyre:: Error > ) {
5+ pub async fn copy_io < A , B > ( a : & mut A , b : & mut B ) -> ( usize , usize , Option < std:: io:: Error > )
6+ where
7+ A : AsyncRead + AsyncWrite + Unpin + ?Sized ,
8+ B : AsyncRead + AsyncWrite + Unpin + ?Sized ,
9+ {
910 let mut a2b = [ 0u8 ; BUFFER_SIZE ] ;
1011 let mut b2a = [ 0u8 ; BUFFER_SIZE ] ;
1112
@@ -16,42 +17,40 @@ pub async fn exchange_tcp(
1617
1718 loop {
1819 tokio:: select! {
19- a2b_res = a. recv. read( & mut a2b) => match a2b_res {
20- Ok ( Some ( num) ) => {
21- a2b_num += num;
22- if let Err ( err) = b. write_all( & a2b[ ..num] ) . await {
23- last_err = Some ( err. into( ) ) ;
24- break ;
25- }
26- } ,
27- // EOF
28- Ok ( None ) => {
20+ a2b_res = a. read( & mut a2b) => match a2b_res {
21+ Ok ( num) => {
22+ // EOF
23+ if num == 0 {
2924 break ;
30- } ,
31- Err ( err) => {
32- last_err = Some ( err. into( ) ) ;
25+ }
26+ a2b_num += num;
27+ if let Err ( err) = b. write_all( & a2b[ ..num] ) . await {
28+ last_err = Some ( err) ;
3329 break ;
34- }
35- } ,
36-
37- b2a_res = b. read( & mut b2a) => match b2a_res {
38- Ok ( num) => {
39- // EOF
40- if num == 0 {
41- break ;
42- }
43- b2a_num += num;
44- if let Err ( err) = a. send. write_all( & b2a[ ..num] ) . await {
45- last_err = Some ( err. into( ) ) ;
46- break ;
47- }
48- } ,
49- Err ( err) => {
50- last_err = Some ( err. into( ) ) ;
30+ }
31+ } ,
32+ Err ( err) => {
33+ last_err = Some ( err) ;
34+ break ;
35+ }
36+ } ,
37+ b2a_res = b. read( & mut b2a) => match b2a_res {
38+ Ok ( num) => {
39+ // EOF
40+ if num == 0 {
5141 break ;
52- } ,
53- }
54-
42+ }
43+ b2a_num += num;
44+ if let Err ( err) = a. write_all( & b2a[ ..num] ) . await {
45+ last_err = Some ( err) ;
46+ break ;
47+ }
48+ } ,
49+ Err ( err) => {
50+ last_err = Some ( err) ;
51+ break ;
52+ } ,
53+ }
5554 }
5655 }
5756
0 commit comments