Skip to content

Commit

Permalink
Merge pull request #995 from piegamesde/master
Browse files Browse the repository at this point in the history
Add TcpListener::into_incoming
  • Loading branch information
yoshuawuyts authored Nov 29, 2021
2 parents 69bb5cf + d3133c0 commit 4ee4beb
Showing 1 changed file with 39 additions and 0 deletions.
39 changes: 39 additions & 0 deletions src/net/tcp/listener.rs
Original file line number Diff line number Diff line change
Expand Up @@ -150,6 +150,45 @@ impl TcpListener {
Incoming {
incoming: Box::pin(self.watcher.incoming()),
}
}

/// Turn this into a stream over the connections being received on this
/// listener.
///
/// The returned stream is infinite and will also not yield
/// the peer's [`SocketAddr`] structure. Iterating over it is equivalent to
/// calling [`TcpListener::accept`] in a loop.
///
/// ## Examples
///
/// Merge the incoming connections of multiple sockets into one [`Stream`]:
///
/// ```no_run
/// # fn main() -> std::io::Result<()> { async_std::task::block_on(async {
/// #
/// use async_std::net::TcpListener;
///
/// // Our server listens on multiple ports for some reason
/// let listeners = vec![
/// TcpListener::bind("[::0]:8080").await?,
/// TcpListener::bind("[::0]:12345").await?,
/// TcpListener::bind("[::0]:5678").await?,
/// ];
/// // Iterate over all incoming connections
/// let incoming = futures::stream::select_all(
/// listeners.into_iter()
/// .map(TcpListener::into_incoming)
/// .map(Box::pin)
/// );
/// #
/// # Ok(()) }) }
/// ```
#[cfg(feature = "unstable")]
pub fn into_incoming(self) -> impl Stream<Item = io::Result<TcpStream>> + Send {
futures_lite::stream::unfold(self, |listener| async move {
let res = listener.accept().await.map(|(stream, _)| stream);
Some((res, listener))
})
}

/// Returns the local address that this listener is bound to.
Expand Down

0 comments on commit 4ee4beb

Please sign in to comment.