@@ -7,6 +7,7 @@ use std::io::{Error, ErrorKind};
77use std:: net:: { IpAddr , SocketAddr } ;
88use std:: str:: FromStr ;
99use tokio:: net:: { TcpListener , TcpStream } ;
10+ use futures:: future:: select_all;
1011
1112pub struct TcpSocket {
1213 tcp_listeners : Vec < TcpListener > ,
@@ -62,16 +63,18 @@ impl TcpSocket {
6263 }
6364
6465 pub async fn accept ( & self ) -> io:: Result < ( TcpStream , SocketAddr ) > {
65- for listener in & self . tcp_listeners {
66- tokio:: select! {
67- result = listener. accept( ) => {
68- let ( stream, addr) = result?;
69- return Ok ( ( stream, addr) ) ;
70- }
71- _ = tokio:: time:: sleep( std:: time:: Duration :: from_millis( 1 ) ) => { }
72- }
66+ if self . tcp_listeners . is_empty ( ) {
67+ return Err ( Error :: new (
68+ ErrorKind :: NotConnected ,
69+ "No listeners found." ,
70+ ) ) ;
7371 }
74- Err ( Error :: new ( ErrorKind :: Other , "No listeners found." ) )
72+
73+ let accept_futures = self . tcp_listeners . iter ( ) . map ( |listener| {
74+ Box :: pin ( listener. accept ( ) )
75+ } ) ;
76+ let ( result, _index, _remaining) = select_all ( accept_futures) . await ;
77+ result // result of the first future to complete
7578 }
7679}
7780
0 commit comments