Skip to content

Commit fad81b2

Browse files
authored
Merge pull request #24 from lxb007981/master
Use future::select_all for accept()
2 parents 0938dee + f393559 commit fad81b2

File tree

3 files changed

+49
-9
lines changed

3 files changed

+49
-9
lines changed

Cargo.lock

Lines changed: 36 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ webpki-roots = "0.26.8"
1313
rustls-pemfile = "2.2.0"
1414
socket2 = "0.5.8"
1515
listenfd = "1.0.2"
16+
futures = "0.3.31"
1617
#ip
1718
maxminddb = "0.25.0"
1819
#image processing

src/http/tcp_socket.rs

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ use std::io::{Error, ErrorKind};
77
use std::net::{IpAddr, SocketAddr};
88
use std::str::FromStr;
99
use tokio::net::{TcpListener, TcpStream};
10+
use futures::future::select_all;
1011

1112
pub 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

Comments
 (0)