@@ -96,6 +96,18 @@ pub struct Incoming<'a> {
9696 listener : & ' a TcpListener ,
9797}
9898
99+ /// An iterator that infinitely [`accept`]s connections on a [`TcpListener`].
100+ ///
101+ /// This `struct` is created by the [`TcpListener::into_incoming`] method.
102+ /// See its documentation for more.
103+ ///
104+ /// [`accept`]: TcpListener::accept
105+ #[ derive( Debug ) ]
106+ #[ unstable( feature = "tcplistener_into_incoming" , issue = "88339" ) ]
107+ pub struct IntoIncoming {
108+ listener : TcpListener ,
109+ }
110+
99111impl TcpStream {
100112 /// Opens a TCP connection to a remote host.
101113 ///
@@ -798,6 +810,37 @@ impl TcpListener {
798810 Incoming { listener : self }
799811 }
800812
813+ /// Turn this into an iterator over the connections being received on this
814+ /// listener.
815+ ///
816+ /// The returned iterator will never return [`None`] and will also not yield
817+ /// the peer's [`SocketAddr`] structure. Iterating over it is equivalent to
818+ /// calling [`TcpListener::accept`] in a loop.
819+ ///
820+ /// # Examples
821+ ///
822+ /// ```no_run
823+ /// #![feature(tcplistener_into_incoming)]
824+ /// use std::net::{TcpListener, TcpStream};
825+ ///
826+ /// fn listen_on(port: u16) -> impl Iterator<Item = TcpStream> {
827+ /// let listener = TcpListener::bind("127.0.0.1:80").unwrap();
828+ /// listener.into_incoming()
829+ /// .filter_map(Result::ok) /* Ignore failed connections */
830+ /// }
831+ ///
832+ /// fn main() -> std::io::Result<()> {
833+ /// for stream in listen_on(80) {
834+ /// /* handle the connection here */
835+ /// }
836+ /// Ok(())
837+ /// }
838+ /// ```
839+ #[ unstable( feature = "tcplistener_into_incoming" , issue = "88339" ) ]
840+ pub fn into_incoming ( self ) -> IntoIncoming {
841+ IntoIncoming { listener : self }
842+ }
843+
801844 /// Sets the value for the `IP_TTL` option on this socket.
802845 ///
803846 /// This value sets the time-to-live field that is used in every packet sent
@@ -935,6 +978,14 @@ impl<'a> Iterator for Incoming<'a> {
935978 }
936979}
937980
981+ #[ unstable( feature = "tcplistener_into_incoming" , issue = "88339" ) ]
982+ impl Iterator for IntoIncoming {
983+ type Item = io:: Result < TcpStream > ;
984+ fn next ( & mut self ) -> Option < io:: Result < TcpStream > > {
985+ Some ( self . listener . accept ( ) . map ( |p| p. 0 ) )
986+ }
987+ }
988+
938989impl AsInner < net_imp:: TcpListener > for TcpListener {
939990 fn as_inner ( & self ) -> & net_imp:: TcpListener {
940991 & self . 0
0 commit comments