std/net/
tcp.rs

1#![deny(unsafe_op_in_unsafe_fn)]
2
3#[cfg(all(
4    test,
5    not(any(
6        target_os = "emscripten",
7        all(target_os = "wasi", target_env = "p1"),
8        target_os = "xous",
9        target_os = "trusty",
10    ))
11))]
12mod tests;
13
14use crate::fmt;
15use crate::io::prelude::*;
16use crate::io::{self, BorrowedCursor, IoSlice, IoSliceMut};
17use crate::iter::FusedIterator;
18use crate::net::{Shutdown, SocketAddr, ToSocketAddrs};
19use crate::sys::net as net_imp;
20use crate::sys_common::{AsInner, FromInner, IntoInner};
21use crate::time::Duration;
22
23/// A TCP stream between a local and a remote socket.
24///
25/// After creating a `TcpStream` by either [`connect`]ing to a remote host or
26/// [`accept`]ing a connection on a [`TcpListener`], data can be transmitted
27/// by [reading] and [writing] to it.
28///
29/// The connection will be closed when the value is dropped. The reading and writing
30/// portions of the connection can also be shut down individually with the [`shutdown`]
31/// method.
32///
33/// The Transmission Control Protocol is specified in [IETF RFC 793].
34///
35/// [`accept`]: TcpListener::accept
36/// [`connect`]: TcpStream::connect
37/// [IETF RFC 793]: https://tools.ietf.org/html/rfc793
38/// [reading]: Read
39/// [`shutdown`]: TcpStream::shutdown
40/// [writing]: Write
41///
42/// # Examples
43///
44/// ```no_run
45/// use std::io::prelude::*;
46/// use std::net::TcpStream;
47///
48/// fn main() -> std::io::Result<()> {
49///     let mut stream = TcpStream::connect("127.0.0.1:34254")?;
50///
51///     stream.write(&[1])?;
52///     stream.read(&mut [0; 128])?;
53///     Ok(())
54/// } // the stream is closed here
55/// ```
56#[stable(feature = "rust1", since = "1.0.0")]
57pub struct TcpStream(net_imp::TcpStream);
58
59/// A TCP socket server, listening for connections.
60///
61/// After creating a `TcpListener` by [`bind`]ing it to a socket address, it listens
62/// for incoming TCP connections. These can be accepted by calling [`accept`] or by
63/// iterating over the [`Incoming`] iterator returned by [`incoming`][`TcpListener::incoming`].
64///
65/// The socket will be closed when the value is dropped.
66///
67/// The Transmission Control Protocol is specified in [IETF RFC 793].
68///
69/// [`accept`]: TcpListener::accept
70/// [`bind`]: TcpListener::bind
71/// [IETF RFC 793]: https://tools.ietf.org/html/rfc793
72///
73/// # Examples
74///
75/// ```no_run
76/// use std::net::{TcpListener, TcpStream};
77///
78/// fn handle_client(stream: TcpStream) {
79///     // ...
80/// }
81///
82/// fn main() -> std::io::Result<()> {
83///     let listener = TcpListener::bind("127.0.0.1:80")?;
84///
85///     // accept connections and process them serially
86///     for stream in listener.incoming() {
87///         handle_client(stream?);
88///     }
89///     Ok(())
90/// }
91/// ```
92#[stable(feature = "rust1", since = "1.0.0")]
93pub struct TcpListener(net_imp::TcpListener);
94
95/// An iterator that infinitely [`accept`]s connections on a [`TcpListener`].
96///
97/// This `struct` is created by the [`TcpListener::incoming`] method.
98/// See its documentation for more.
99///
100/// [`accept`]: TcpListener::accept
101#[must_use = "iterators are lazy and do nothing unless consumed"]
102#[stable(feature = "rust1", since = "1.0.0")]
103#[derive(Debug)]
104pub struct Incoming<'a> {
105    listener: &'a TcpListener,
106}
107
108/// An iterator that infinitely [`accept`]s connections on a [`TcpListener`].
109///
110/// This `struct` is created by the [`TcpListener::into_incoming`] method.
111/// See its documentation for more.
112///
113/// [`accept`]: TcpListener::accept
114#[derive(Debug)]
115#[unstable(feature = "tcplistener_into_incoming", issue = "88373")]
116pub struct IntoIncoming {
117    listener: TcpListener,
118}
119
120impl TcpStream {
121    /// Opens a TCP connection to a remote host.
122    ///
123    /// `addr` is an address of the remote host. Anything which implements
124    /// [`ToSocketAddrs`] trait can be supplied for the address; see this trait
125    /// documentation for concrete examples.
126    ///
127    /// If `addr` yields multiple addresses, `connect` will be attempted with
128    /// each of the addresses until a connection is successful. If none of
129    /// the addresses result in a successful connection, the error returned from
130    /// the last connection attempt (the last address) is returned.
131    ///
132    /// # Examples
133    ///
134    /// Open a TCP connection to `127.0.0.1:8080`:
135    ///
136    /// ```no_run
137    /// use std::net::TcpStream;
138    ///
139    /// if let Ok(stream) = TcpStream::connect("127.0.0.1:8080") {
140    ///     println!("Connected to the server!");
141    /// } else {
142    ///     println!("Couldn't connect to server...");
143    /// }
144    /// ```
145    ///
146    /// Open a TCP connection to `127.0.0.1:8080`. If the connection fails, open
147    /// a TCP connection to `127.0.0.1:8081`:
148    ///
149    /// ```no_run
150    /// use std::net::{SocketAddr, TcpStream};
151    ///
152    /// let addrs = [
153    ///     SocketAddr::from(([127, 0, 0, 1], 8080)),
154    ///     SocketAddr::from(([127, 0, 0, 1], 8081)),
155    /// ];
156    /// if let Ok(stream) = TcpStream::connect(&addrs[..]) {
157    ///     println!("Connected to the server!");
158    /// } else {
159    ///     println!("Couldn't connect to server...");
160    /// }
161    /// ```
162    #[stable(feature = "rust1", since = "1.0.0")]
163    pub fn connect<A: ToSocketAddrs>(addr: A) -> io::Result<TcpStream> {
164        super::each_addr(addr, net_imp::TcpStream::connect).map(TcpStream)
165    }
166
167    /// Opens a TCP connection to a remote host with a timeout.
168    ///
169    /// Unlike `connect`, `connect_timeout` takes a single [`SocketAddr`] since
170    /// timeout must be applied to individual addresses.
171    ///
172    /// It is an error to pass a zero `Duration` to this function.
173    ///
174    /// Unlike other methods on `TcpStream`, this does not correspond to a
175    /// single system call. It instead calls `connect` in nonblocking mode and
176    /// then uses an OS-specific mechanism to await the completion of the
177    /// connection request.
178    #[stable(feature = "tcpstream_connect_timeout", since = "1.21.0")]
179    pub fn connect_timeout(addr: &SocketAddr, timeout: Duration) -> io::Result<TcpStream> {
180        net_imp::TcpStream::connect_timeout(addr, timeout).map(TcpStream)
181    }
182
183    /// Returns the socket address of the remote peer of this TCP connection.
184    ///
185    /// # Examples
186    ///
187    /// ```no_run
188    /// use std::net::{Ipv4Addr, SocketAddr, SocketAddrV4, TcpStream};
189    ///
190    /// let stream = TcpStream::connect("127.0.0.1:8080")
191    ///                        .expect("Couldn't connect to the server...");
192    /// assert_eq!(stream.peer_addr().unwrap(),
193    ///            SocketAddr::V4(SocketAddrV4::new(Ipv4Addr::new(127, 0, 0, 1), 8080)));
194    /// ```
195    #[stable(feature = "rust1", since = "1.0.0")]
196    pub fn peer_addr(&self) -> io::Result<SocketAddr> {
197        self.0.peer_addr()
198    }
199
200    /// Returns the socket address of the local half of this TCP connection.
201    ///
202    /// # Examples
203    ///
204    /// ```no_run
205    /// use std::net::{IpAddr, Ipv4Addr, TcpStream};
206    ///
207    /// let stream = TcpStream::connect("127.0.0.1:8080")
208    ///                        .expect("Couldn't connect to the server...");
209    /// assert_eq!(stream.local_addr().unwrap().ip(),
210    ///            IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)));
211    /// ```
212    #[stable(feature = "rust1", since = "1.0.0")]
213    pub fn local_addr(&self) -> io::Result<SocketAddr> {
214        self.0.socket_addr()
215    }
216
217    /// Shuts down the read, write, or both halves of this connection.
218    ///
219    /// This function will cause all pending and future I/O on the specified
220    /// portions to return immediately with an appropriate value (see the
221    /// documentation of [`Shutdown`]).
222    ///
223    /// # Platform-specific behavior
224    ///
225    /// Calling this function multiple times may result in different behavior,
226    /// depending on the operating system. On Linux, the second call will
227    /// return `Ok(())`, but on macOS, it will return `ErrorKind::NotConnected`.
228    /// This may change in the future.
229    ///
230    /// # Examples
231    ///
232    /// ```no_run
233    /// use std::net::{Shutdown, TcpStream};
234    ///
235    /// let stream = TcpStream::connect("127.0.0.1:8080")
236    ///                        .expect("Couldn't connect to the server...");
237    /// stream.shutdown(Shutdown::Both).expect("shutdown call failed");
238    /// ```
239    #[stable(feature = "rust1", since = "1.0.0")]
240    pub fn shutdown(&self, how: Shutdown) -> io::Result<()> {
241        self.0.shutdown(how)
242    }
243
244    /// Creates a new independently owned handle to the underlying socket.
245    ///
246    /// The returned `TcpStream` is a reference to the same stream that this
247    /// object references. Both handles will read and write the same stream of
248    /// data, and options set on one stream will be propagated to the other
249    /// stream.
250    ///
251    /// # Examples
252    ///
253    /// ```no_run
254    /// use std::net::TcpStream;
255    ///
256    /// let stream = TcpStream::connect("127.0.0.1:8080")
257    ///                        .expect("Couldn't connect to the server...");
258    /// let stream_clone = stream.try_clone().expect("clone failed...");
259    /// ```
260    #[stable(feature = "rust1", since = "1.0.0")]
261    pub fn try_clone(&self) -> io::Result<TcpStream> {
262        self.0.duplicate().map(TcpStream)
263    }
264
265    /// Sets the read timeout to the timeout specified.
266    ///
267    /// If the value specified is [`None`], then [`read`] calls will block
268    /// indefinitely. An [`Err`] is returned if the zero [`Duration`] is
269    /// passed to this method.
270    ///
271    /// # Platform-specific behavior
272    ///
273    /// Platforms may return a different error code whenever a read times out as
274    /// a result of setting this option. For example Unix typically returns an
275    /// error of the kind [`WouldBlock`], but Windows may return [`TimedOut`].
276    ///
277    /// [`read`]: Read::read
278    /// [`WouldBlock`]: io::ErrorKind::WouldBlock
279    /// [`TimedOut`]: io::ErrorKind::TimedOut
280    ///
281    /// # Examples
282    ///
283    /// ```no_run
284    /// use std::net::TcpStream;
285    ///
286    /// let stream = TcpStream::connect("127.0.0.1:8080")
287    ///                        .expect("Couldn't connect to the server...");
288    /// stream.set_read_timeout(None).expect("set_read_timeout call failed");
289    /// ```
290    ///
291    /// An [`Err`] is returned if the zero [`Duration`] is passed to this
292    /// method:
293    ///
294    /// ```no_run
295    /// use std::io;
296    /// use std::net::TcpStream;
297    /// use std::time::Duration;
298    ///
299    /// let stream = TcpStream::connect("127.0.0.1:8080").unwrap();
300    /// let result = stream.set_read_timeout(Some(Duration::new(0, 0)));
301    /// let err = result.unwrap_err();
302    /// assert_eq!(err.kind(), io::ErrorKind::InvalidInput)
303    /// ```
304    #[stable(feature = "socket_timeout", since = "1.4.0")]
305    pub fn set_read_timeout(&self, dur: Option<Duration>) -> io::Result<()> {
306        self.0.set_read_timeout(dur)
307    }
308
309    /// Sets the write timeout to the timeout specified.
310    ///
311    /// If the value specified is [`None`], then [`write`] calls will block
312    /// indefinitely. An [`Err`] is returned if the zero [`Duration`] is
313    /// passed to this method.
314    ///
315    /// # Platform-specific behavior
316    ///
317    /// Platforms may return a different error code whenever a write times out
318    /// as a result of setting this option. For example Unix typically returns
319    /// an error of the kind [`WouldBlock`], but Windows may return [`TimedOut`].
320    ///
321    /// [`write`]: Write::write
322    /// [`WouldBlock`]: io::ErrorKind::WouldBlock
323    /// [`TimedOut`]: io::ErrorKind::TimedOut
324    ///
325    /// # Examples
326    ///
327    /// ```no_run
328    /// use std::net::TcpStream;
329    ///
330    /// let stream = TcpStream::connect("127.0.0.1:8080")
331    ///                        .expect("Couldn't connect to the server...");
332    /// stream.set_write_timeout(None).expect("set_write_timeout call failed");
333    /// ```
334    ///
335    /// An [`Err`] is returned if the zero [`Duration`] is passed to this
336    /// method:
337    ///
338    /// ```no_run
339    /// use std::io;
340    /// use std::net::TcpStream;
341    /// use std::time::Duration;
342    ///
343    /// let stream = TcpStream::connect("127.0.0.1:8080").unwrap();
344    /// let result = stream.set_write_timeout(Some(Duration::new(0, 0)));
345    /// let err = result.unwrap_err();
346    /// assert_eq!(err.kind(), io::ErrorKind::InvalidInput)
347    /// ```
348    #[stable(feature = "socket_timeout", since = "1.4.0")]
349    pub fn set_write_timeout(&self, dur: Option<Duration>) -> io::Result<()> {
350        self.0.set_write_timeout(dur)
351    }
352
353    /// Returns the read timeout of this socket.
354    ///
355    /// If the timeout is [`None`], then [`read`] calls will block indefinitely.
356    ///
357    /// # Platform-specific behavior
358    ///
359    /// Some platforms do not provide access to the current timeout.
360    ///
361    /// [`read`]: Read::read
362    ///
363    /// # Examples
364    ///
365    /// ```no_run
366    /// use std::net::TcpStream;
367    ///
368    /// let stream = TcpStream::connect("127.0.0.1:8080")
369    ///                        .expect("Couldn't connect to the server...");
370    /// stream.set_read_timeout(None).expect("set_read_timeout call failed");
371    /// assert_eq!(stream.read_timeout().unwrap(), None);
372    /// ```
373    #[stable(feature = "socket_timeout", since = "1.4.0")]
374    pub fn read_timeout(&self) -> io::Result<Option<Duration>> {
375        self.0.read_timeout()
376    }
377
378    /// Returns the write timeout of this socket.
379    ///
380    /// If the timeout is [`None`], then [`write`] calls will block indefinitely.
381    ///
382    /// # Platform-specific behavior
383    ///
384    /// Some platforms do not provide access to the current timeout.
385    ///
386    /// [`write`]: Write::write
387    ///
388    /// # Examples
389    ///
390    /// ```no_run
391    /// use std::net::TcpStream;
392    ///
393    /// let stream = TcpStream::connect("127.0.0.1:8080")
394    ///                        .expect("Couldn't connect to the server...");
395    /// stream.set_write_timeout(None).expect("set_write_timeout call failed");
396    /// assert_eq!(stream.write_timeout().unwrap(), None);
397    /// ```
398    #[stable(feature = "socket_timeout", since = "1.4.0")]
399    pub fn write_timeout(&self) -> io::Result<Option<Duration>> {
400        self.0.write_timeout()
401    }
402
403    /// Receives data on the socket from the remote address to which it is
404    /// connected, without removing that data from the queue. On success,
405    /// returns the number of bytes peeked.
406    ///
407    /// Successive calls return the same data. This is accomplished by passing
408    /// `MSG_PEEK` as a flag to the underlying `recv` system call.
409    ///
410    /// # Examples
411    ///
412    /// ```no_run
413    /// use std::net::TcpStream;
414    ///
415    /// let stream = TcpStream::connect("127.0.0.1:8000")
416    ///                        .expect("Couldn't connect to the server...");
417    /// let mut buf = [0; 10];
418    /// let len = stream.peek(&mut buf).expect("peek failed");
419    /// ```
420    #[stable(feature = "peek", since = "1.18.0")]
421    pub fn peek(&self, buf: &mut [u8]) -> io::Result<usize> {
422        self.0.peek(buf)
423    }
424
425    /// Sets the value of the `SO_LINGER` option on this socket.
426    ///
427    /// This value controls how the socket is closed when data remains
428    /// to be sent. If `SO_LINGER` is set, the socket will remain open
429    /// for the specified duration as the system attempts to send pending data.
430    /// Otherwise, the system may close the socket immediately, or wait for a
431    /// default timeout.
432    ///
433    /// # Examples
434    ///
435    /// ```no_run
436    /// #![feature(tcp_linger)]
437    ///
438    /// use std::net::TcpStream;
439    /// use std::time::Duration;
440    ///
441    /// let stream = TcpStream::connect("127.0.0.1:8080")
442    ///                        .expect("Couldn't connect to the server...");
443    /// stream.set_linger(Some(Duration::from_secs(0))).expect("set_linger call failed");
444    /// ```
445    #[unstable(feature = "tcp_linger", issue = "88494")]
446    pub fn set_linger(&self, linger: Option<Duration>) -> io::Result<()> {
447        self.0.set_linger(linger)
448    }
449
450    /// Gets the value of the `SO_LINGER` option on this socket.
451    ///
452    /// For more information about this option, see [`TcpStream::set_linger`].
453    ///
454    /// # Examples
455    ///
456    /// ```no_run
457    /// #![feature(tcp_linger)]
458    ///
459    /// use std::net::TcpStream;
460    /// use std::time::Duration;
461    ///
462    /// let stream = TcpStream::connect("127.0.0.1:8080")
463    ///                        .expect("Couldn't connect to the server...");
464    /// stream.set_linger(Some(Duration::from_secs(0))).expect("set_linger call failed");
465    /// assert_eq!(stream.linger().unwrap(), Some(Duration::from_secs(0)));
466    /// ```
467    #[unstable(feature = "tcp_linger", issue = "88494")]
468    pub fn linger(&self) -> io::Result<Option<Duration>> {
469        self.0.linger()
470    }
471
472    /// Sets the value of the `TCP_NODELAY` option on this socket.
473    ///
474    /// If set, this option disables the Nagle algorithm. This means that
475    /// segments are always sent as soon as possible, even if there is only a
476    /// small amount of data. When not set, data is buffered until there is a
477    /// sufficient amount to send out, thereby avoiding the frequent sending of
478    /// small packets.
479    ///
480    /// # Examples
481    ///
482    /// ```no_run
483    /// use std::net::TcpStream;
484    ///
485    /// let stream = TcpStream::connect("127.0.0.1:8080")
486    ///                        .expect("Couldn't connect to the server...");
487    /// stream.set_nodelay(true).expect("set_nodelay call failed");
488    /// ```
489    #[stable(feature = "net2_mutators", since = "1.9.0")]
490    pub fn set_nodelay(&self, nodelay: bool) -> io::Result<()> {
491        self.0.set_nodelay(nodelay)
492    }
493
494    /// Gets the value of the `TCP_NODELAY` option on this socket.
495    ///
496    /// For more information about this option, see [`TcpStream::set_nodelay`].
497    ///
498    /// # Examples
499    ///
500    /// ```no_run
501    /// use std::net::TcpStream;
502    ///
503    /// let stream = TcpStream::connect("127.0.0.1:8080")
504    ///                        .expect("Couldn't connect to the server...");
505    /// stream.set_nodelay(true).expect("set_nodelay call failed");
506    /// assert_eq!(stream.nodelay().unwrap_or(false), true);
507    /// ```
508    #[stable(feature = "net2_mutators", since = "1.9.0")]
509    pub fn nodelay(&self) -> io::Result<bool> {
510        self.0.nodelay()
511    }
512
513    /// Sets the value for the `IP_TTL` option on this socket.
514    ///
515    /// This value sets the time-to-live field that is used in every packet sent
516    /// from this socket.
517    ///
518    /// # Examples
519    ///
520    /// ```no_run
521    /// use std::net::TcpStream;
522    ///
523    /// let stream = TcpStream::connect("127.0.0.1:8080")
524    ///                        .expect("Couldn't connect to the server...");
525    /// stream.set_ttl(100).expect("set_ttl call failed");
526    /// ```
527    #[stable(feature = "net2_mutators", since = "1.9.0")]
528    pub fn set_ttl(&self, ttl: u32) -> io::Result<()> {
529        self.0.set_ttl(ttl)
530    }
531
532    /// Gets the value of the `IP_TTL` option for this socket.
533    ///
534    /// For more information about this option, see [`TcpStream::set_ttl`].
535    ///
536    /// # Examples
537    ///
538    /// ```no_run
539    /// use std::net::TcpStream;
540    ///
541    /// let stream = TcpStream::connect("127.0.0.1:8080")
542    ///                        .expect("Couldn't connect to the server...");
543    /// stream.set_ttl(100).expect("set_ttl call failed");
544    /// assert_eq!(stream.ttl().unwrap_or(0), 100);
545    /// ```
546    #[stable(feature = "net2_mutators", since = "1.9.0")]
547    pub fn ttl(&self) -> io::Result<u32> {
548        self.0.ttl()
549    }
550
551    /// Gets the value of the `SO_ERROR` option on this socket.
552    ///
553    /// This will retrieve the stored error in the underlying socket, clearing
554    /// the field in the process. This can be useful for checking errors between
555    /// calls.
556    ///
557    /// # Examples
558    ///
559    /// ```no_run
560    /// use std::net::TcpStream;
561    ///
562    /// let stream = TcpStream::connect("127.0.0.1:8080")
563    ///                        .expect("Couldn't connect to the server...");
564    /// stream.take_error().expect("No error was expected...");
565    /// ```
566    #[stable(feature = "net2_mutators", since = "1.9.0")]
567    pub fn take_error(&self) -> io::Result<Option<io::Error>> {
568        self.0.take_error()
569    }
570
571    /// Moves this TCP stream into or out of nonblocking mode.
572    ///
573    /// This will result in `read`, `write`, `recv` and `send` system operations
574    /// becoming nonblocking, i.e., immediately returning from their calls.
575    /// If the IO operation is successful, `Ok` is returned and no further
576    /// action is required. If the IO operation could not be completed and needs
577    /// to be retried, an error with kind [`io::ErrorKind::WouldBlock`] is
578    /// returned.
579    ///
580    /// On Unix platforms, calling this method corresponds to calling `fcntl`
581    /// `FIONBIO`. On Windows calling this method corresponds to calling
582    /// `ioctlsocket` `FIONBIO`.
583    ///
584    /// # Examples
585    ///
586    /// Reading bytes from a TCP stream in non-blocking mode:
587    ///
588    /// ```no_run
589    /// use std::io::{self, Read};
590    /// use std::net::TcpStream;
591    ///
592    /// let mut stream = TcpStream::connect("127.0.0.1:7878")
593    ///     .expect("Couldn't connect to the server...");
594    /// stream.set_nonblocking(true).expect("set_nonblocking call failed");
595    ///
596    /// # fn wait_for_fd() { unimplemented!() }
597    /// let mut buf = vec![];
598    /// loop {
599    ///     match stream.read_to_end(&mut buf) {
600    ///         Ok(_) => break,
601    ///         Err(ref e) if e.kind() == io::ErrorKind::WouldBlock => {
602    ///             // wait until network socket is ready, typically implemented
603    ///             // via platform-specific APIs such as epoll or IOCP
604    ///             wait_for_fd();
605    ///         }
606    ///         Err(e) => panic!("encountered IO error: {e}"),
607    ///     };
608    /// };
609    /// println!("bytes: {buf:?}");
610    /// ```
611    #[stable(feature = "net2_mutators", since = "1.9.0")]
612    pub fn set_nonblocking(&self, nonblocking: bool) -> io::Result<()> {
613        self.0.set_nonblocking(nonblocking)
614    }
615}
616
617// In addition to the `impl`s here, `TcpStream` also has `impl`s for
618// `AsFd`/`From<OwnedFd>`/`Into<OwnedFd>` and
619// `AsRawFd`/`IntoRawFd`/`FromRawFd`, on Unix and WASI, and
620// `AsSocket`/`From<OwnedSocket>`/`Into<OwnedSocket>` and
621// `AsRawSocket`/`IntoRawSocket`/`FromRawSocket` on Windows.
622
623#[stable(feature = "rust1", since = "1.0.0")]
624impl Read for TcpStream {
625    fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
626        self.0.read(buf)
627    }
628
629    fn read_buf(&mut self, buf: BorrowedCursor<'_>) -> io::Result<()> {
630        self.0.read_buf(buf)
631    }
632
633    fn read_vectored(&mut self, bufs: &mut [IoSliceMut<'_>]) -> io::Result<usize> {
634        self.0.read_vectored(bufs)
635    }
636
637    #[inline]
638    fn is_read_vectored(&self) -> bool {
639        self.0.is_read_vectored()
640    }
641}
642#[stable(feature = "rust1", since = "1.0.0")]
643impl Write for TcpStream {
644    fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
645        self.0.write(buf)
646    }
647
648    fn write_vectored(&mut self, bufs: &[IoSlice<'_>]) -> io::Result<usize> {
649        self.0.write_vectored(bufs)
650    }
651
652    #[inline]
653    fn is_write_vectored(&self) -> bool {
654        self.0.is_write_vectored()
655    }
656
657    #[inline]
658    fn flush(&mut self) -> io::Result<()> {
659        Ok(())
660    }
661}
662#[stable(feature = "rust1", since = "1.0.0")]
663impl Read for &TcpStream {
664    fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
665        self.0.read(buf)
666    }
667
668    fn read_buf(&mut self, buf: BorrowedCursor<'_>) -> io::Result<()> {
669        self.0.read_buf(buf)
670    }
671
672    fn read_vectored(&mut self, bufs: &mut [IoSliceMut<'_>]) -> io::Result<usize> {
673        self.0.read_vectored(bufs)
674    }
675
676    #[inline]
677    fn is_read_vectored(&self) -> bool {
678        self.0.is_read_vectored()
679    }
680}
681#[stable(feature = "rust1", since = "1.0.0")]
682impl Write for &TcpStream {
683    fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
684        self.0.write(buf)
685    }
686
687    fn write_vectored(&mut self, bufs: &[IoSlice<'_>]) -> io::Result<usize> {
688        self.0.write_vectored(bufs)
689    }
690
691    #[inline]
692    fn is_write_vectored(&self) -> bool {
693        self.0.is_write_vectored()
694    }
695
696    #[inline]
697    fn flush(&mut self) -> io::Result<()> {
698        Ok(())
699    }
700}
701
702impl AsInner<net_imp::TcpStream> for TcpStream {
703    #[inline]
704    fn as_inner(&self) -> &net_imp::TcpStream {
705        &self.0
706    }
707}
708
709impl FromInner<net_imp::TcpStream> for TcpStream {
710    fn from_inner(inner: net_imp::TcpStream) -> TcpStream {
711        TcpStream(inner)
712    }
713}
714
715impl IntoInner<net_imp::TcpStream> for TcpStream {
716    fn into_inner(self) -> net_imp::TcpStream {
717        self.0
718    }
719}
720
721#[stable(feature = "rust1", since = "1.0.0")]
722impl fmt::Debug for TcpStream {
723    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
724        self.0.fmt(f)
725    }
726}
727
728impl TcpListener {
729    /// Creates a new `TcpListener` which will be bound to the specified
730    /// address.
731    ///
732    /// The returned listener is ready for accepting connections.
733    ///
734    /// Binding with a port number of 0 will request that the OS assigns a port
735    /// to this listener. The port allocated can be queried via the
736    /// [`TcpListener::local_addr`] method.
737    ///
738    /// The address type can be any implementor of [`ToSocketAddrs`] trait. See
739    /// its documentation for concrete examples.
740    ///
741    /// If `addr` yields multiple addresses, `bind` will be attempted with
742    /// each of the addresses until one succeeds and returns the listener. If
743    /// none of the addresses succeed in creating a listener, the error returned
744    /// from the last attempt (the last address) is returned.
745    ///
746    /// # Examples
747    ///
748    /// Creates a TCP listener bound to `127.0.0.1:80`:
749    ///
750    /// ```no_run
751    /// use std::net::TcpListener;
752    ///
753    /// let listener = TcpListener::bind("127.0.0.1:80").unwrap();
754    /// ```
755    ///
756    /// Creates a TCP listener bound to `127.0.0.1:80`. If that fails, create a
757    /// TCP listener bound to `127.0.0.1:443`:
758    ///
759    /// ```no_run
760    /// use std::net::{SocketAddr, TcpListener};
761    ///
762    /// let addrs = [
763    ///     SocketAddr::from(([127, 0, 0, 1], 80)),
764    ///     SocketAddr::from(([127, 0, 0, 1], 443)),
765    /// ];
766    /// let listener = TcpListener::bind(&addrs[..]).unwrap();
767    /// ```
768    ///
769    /// Creates a TCP listener bound to a port assigned by the operating system
770    /// at `127.0.0.1`.
771    ///
772    /// ```no_run
773    /// use std::net::TcpListener;
774    ///
775    /// let socket = TcpListener::bind("127.0.0.1:0").unwrap();
776    /// ```
777    #[stable(feature = "rust1", since = "1.0.0")]
778    pub fn bind<A: ToSocketAddrs>(addr: A) -> io::Result<TcpListener> {
779        super::each_addr(addr, net_imp::TcpListener::bind).map(TcpListener)
780    }
781
782    /// Returns the local socket address of this listener.
783    ///
784    /// # Examples
785    ///
786    /// ```no_run
787    /// use std::net::{Ipv4Addr, SocketAddr, SocketAddrV4, TcpListener};
788    ///
789    /// let listener = TcpListener::bind("127.0.0.1:8080").unwrap();
790    /// assert_eq!(listener.local_addr().unwrap(),
791    ///            SocketAddr::V4(SocketAddrV4::new(Ipv4Addr::new(127, 0, 0, 1), 8080)));
792    /// ```
793    #[stable(feature = "rust1", since = "1.0.0")]
794    pub fn local_addr(&self) -> io::Result<SocketAddr> {
795        self.0.socket_addr()
796    }
797
798    /// Creates a new independently owned handle to the underlying socket.
799    ///
800    /// The returned [`TcpListener`] is a reference to the same socket that this
801    /// object references. Both handles can be used to accept incoming
802    /// connections and options set on one listener will affect the other.
803    ///
804    /// # Examples
805    ///
806    /// ```no_run
807    /// use std::net::TcpListener;
808    ///
809    /// let listener = TcpListener::bind("127.0.0.1:8080").unwrap();
810    /// let listener_clone = listener.try_clone().unwrap();
811    /// ```
812    #[stable(feature = "rust1", since = "1.0.0")]
813    pub fn try_clone(&self) -> io::Result<TcpListener> {
814        self.0.duplicate().map(TcpListener)
815    }
816
817    /// Accept a new incoming connection from this listener.
818    ///
819    /// This function will block the calling thread until a new TCP connection
820    /// is established. When established, the corresponding [`TcpStream`] and the
821    /// remote peer's address will be returned.
822    ///
823    /// # Examples
824    ///
825    /// ```no_run
826    /// use std::net::TcpListener;
827    ///
828    /// let listener = TcpListener::bind("127.0.0.1:8080").unwrap();
829    /// match listener.accept() {
830    ///     Ok((_socket, addr)) => println!("new client: {addr:?}"),
831    ///     Err(e) => println!("couldn't get client: {e:?}"),
832    /// }
833    /// ```
834    #[stable(feature = "rust1", since = "1.0.0")]
835    pub fn accept(&self) -> io::Result<(TcpStream, SocketAddr)> {
836        // On WASM, `TcpStream` is uninhabited (as it's unsupported) and so
837        // the `a` variable here is technically unused.
838        #[cfg_attr(target_arch = "wasm32", allow(unused_variables))]
839        self.0.accept().map(|(a, b)| (TcpStream(a), b))
840    }
841
842    /// Returns an iterator over the connections being received on this
843    /// listener.
844    ///
845    /// The returned iterator will never return [`None`] and will also not yield
846    /// the peer's [`SocketAddr`] structure. Iterating over it is equivalent to
847    /// calling [`TcpListener::accept`] in a loop.
848    ///
849    /// # Examples
850    ///
851    /// ```no_run
852    /// use std::net::{TcpListener, TcpStream};
853    ///
854    /// fn handle_connection(stream: TcpStream) {
855    ///    //...
856    /// }
857    ///
858    /// fn main() -> std::io::Result<()> {
859    ///     let listener = TcpListener::bind("127.0.0.1:80")?;
860    ///
861    ///     for stream in listener.incoming() {
862    ///         match stream {
863    ///             Ok(stream) => {
864    ///                 handle_connection(stream);
865    ///             }
866    ///             Err(e) => { /* connection failed */ }
867    ///         }
868    ///     }
869    ///     Ok(())
870    /// }
871    /// ```
872    #[stable(feature = "rust1", since = "1.0.0")]
873    pub fn incoming(&self) -> Incoming<'_> {
874        Incoming { listener: self }
875    }
876
877    /// Turn this into an iterator over the connections being received on this
878    /// listener.
879    ///
880    /// The returned iterator will never return [`None`] and will also not yield
881    /// the peer's [`SocketAddr`] structure. Iterating over it is equivalent to
882    /// calling [`TcpListener::accept`] in a loop.
883    ///
884    /// # Examples
885    ///
886    /// ```no_run
887    /// #![feature(tcplistener_into_incoming)]
888    /// use std::net::{TcpListener, TcpStream};
889    ///
890    /// fn listen_on(port: u16) -> impl Iterator<Item = TcpStream> {
891    ///     let listener = TcpListener::bind(("127.0.0.1", port)).unwrap();
892    ///     listener.into_incoming()
893    ///         .filter_map(Result::ok) /* Ignore failed connections */
894    /// }
895    ///
896    /// fn main() -> std::io::Result<()> {
897    ///     for stream in listen_on(80) {
898    ///         /* handle the connection here */
899    ///     }
900    ///     Ok(())
901    /// }
902    /// ```
903    #[must_use = "`self` will be dropped if the result is not used"]
904    #[unstable(feature = "tcplistener_into_incoming", issue = "88373")]
905    pub fn into_incoming(self) -> IntoIncoming {
906        IntoIncoming { listener: self }
907    }
908
909    /// Sets the value for the `IP_TTL` option on this socket.
910    ///
911    /// This value sets the time-to-live field that is used in every packet sent
912    /// from this socket.
913    ///
914    /// # Examples
915    ///
916    /// ```no_run
917    /// use std::net::TcpListener;
918    ///
919    /// let listener = TcpListener::bind("127.0.0.1:80").unwrap();
920    /// listener.set_ttl(100).expect("could not set TTL");
921    /// ```
922    #[stable(feature = "net2_mutators", since = "1.9.0")]
923    pub fn set_ttl(&self, ttl: u32) -> io::Result<()> {
924        self.0.set_ttl(ttl)
925    }
926
927    /// Gets the value of the `IP_TTL` option for this socket.
928    ///
929    /// For more information about this option, see [`TcpListener::set_ttl`].
930    ///
931    /// # Examples
932    ///
933    /// ```no_run
934    /// use std::net::TcpListener;
935    ///
936    /// let listener = TcpListener::bind("127.0.0.1:80").unwrap();
937    /// listener.set_ttl(100).expect("could not set TTL");
938    /// assert_eq!(listener.ttl().unwrap_or(0), 100);
939    /// ```
940    #[stable(feature = "net2_mutators", since = "1.9.0")]
941    pub fn ttl(&self) -> io::Result<u32> {
942        self.0.ttl()
943    }
944
945    #[stable(feature = "net2_mutators", since = "1.9.0")]
946    #[deprecated(since = "1.16.0", note = "this option can only be set before the socket is bound")]
947    #[allow(missing_docs)]
948    pub fn set_only_v6(&self, only_v6: bool) -> io::Result<()> {
949        self.0.set_only_v6(only_v6)
950    }
951
952    #[stable(feature = "net2_mutators", since = "1.9.0")]
953    #[deprecated(since = "1.16.0", note = "this option can only be set before the socket is bound")]
954    #[allow(missing_docs)]
955    pub fn only_v6(&self) -> io::Result<bool> {
956        self.0.only_v6()
957    }
958
959    /// Gets the value of the `SO_ERROR` option on this socket.
960    ///
961    /// This will retrieve the stored error in the underlying socket, clearing
962    /// the field in the process. This can be useful for checking errors between
963    /// calls.
964    ///
965    /// # Examples
966    ///
967    /// ```no_run
968    /// use std::net::TcpListener;
969    ///
970    /// let listener = TcpListener::bind("127.0.0.1:80").unwrap();
971    /// listener.take_error().expect("No error was expected");
972    /// ```
973    #[stable(feature = "net2_mutators", since = "1.9.0")]
974    pub fn take_error(&self) -> io::Result<Option<io::Error>> {
975        self.0.take_error()
976    }
977
978    /// Moves this TCP stream into or out of nonblocking mode.
979    ///
980    /// This will result in the `accept` operation becoming nonblocking,
981    /// i.e., immediately returning from their calls. If the IO operation is
982    /// successful, `Ok` is returned and no further action is required. If the
983    /// IO operation could not be completed and needs to be retried, an error
984    /// with kind [`io::ErrorKind::WouldBlock`] is returned.
985    ///
986    /// On Unix platforms, calling this method corresponds to calling `fcntl`
987    /// `FIONBIO`. On Windows calling this method corresponds to calling
988    /// `ioctlsocket` `FIONBIO`.
989    ///
990    /// # Examples
991    ///
992    /// Bind a TCP listener to an address, listen for connections, and read
993    /// bytes in nonblocking mode:
994    ///
995    /// ```no_run
996    /// use std::io;
997    /// use std::net::TcpListener;
998    ///
999    /// let listener = TcpListener::bind("127.0.0.1:7878").unwrap();
1000    /// listener.set_nonblocking(true).expect("Cannot set non-blocking");
1001    ///
1002    /// # fn wait_for_fd() { unimplemented!() }
1003    /// # fn handle_connection(stream: std::net::TcpStream) { unimplemented!() }
1004    /// for stream in listener.incoming() {
1005    ///     match stream {
1006    ///         Ok(s) => {
1007    ///             // do something with the TcpStream
1008    ///             handle_connection(s);
1009    ///         }
1010    ///         Err(ref e) if e.kind() == io::ErrorKind::WouldBlock => {
1011    ///             // wait until network socket is ready, typically implemented
1012    ///             // via platform-specific APIs such as epoll or IOCP
1013    ///             wait_for_fd();
1014    ///             continue;
1015    ///         }
1016    ///         Err(e) => panic!("encountered IO error: {e}"),
1017    ///     }
1018    /// }
1019    /// ```
1020    #[stable(feature = "net2_mutators", since = "1.9.0")]
1021    pub fn set_nonblocking(&self, nonblocking: bool) -> io::Result<()> {
1022        self.0.set_nonblocking(nonblocking)
1023    }
1024}
1025
1026// In addition to the `impl`s here, `TcpListener` also has `impl`s for
1027// `AsFd`/`From<OwnedFd>`/`Into<OwnedFd>` and
1028// `AsRawFd`/`IntoRawFd`/`FromRawFd`, on Unix and WASI, and
1029// `AsSocket`/`From<OwnedSocket>`/`Into<OwnedSocket>` and
1030// `AsRawSocket`/`IntoRawSocket`/`FromRawSocket` on Windows.
1031
1032#[stable(feature = "rust1", since = "1.0.0")]
1033impl<'a> Iterator for Incoming<'a> {
1034    type Item = io::Result<TcpStream>;
1035    fn next(&mut self) -> Option<io::Result<TcpStream>> {
1036        Some(self.listener.accept().map(|p| p.0))
1037    }
1038}
1039
1040#[stable(feature = "tcp_listener_incoming_fused_iterator", since = "1.64.0")]
1041impl FusedIterator for Incoming<'_> {}
1042
1043#[unstable(feature = "tcplistener_into_incoming", issue = "88373")]
1044impl Iterator for IntoIncoming {
1045    type Item = io::Result<TcpStream>;
1046    fn next(&mut self) -> Option<io::Result<TcpStream>> {
1047        Some(self.listener.accept().map(|p| p.0))
1048    }
1049}
1050
1051#[unstable(feature = "tcplistener_into_incoming", issue = "88373")]
1052impl FusedIterator for IntoIncoming {}
1053
1054impl AsInner<net_imp::TcpListener> for TcpListener {
1055    #[inline]
1056    fn as_inner(&self) -> &net_imp::TcpListener {
1057        &self.0
1058    }
1059}
1060
1061impl FromInner<net_imp::TcpListener> for TcpListener {
1062    fn from_inner(inner: net_imp::TcpListener) -> TcpListener {
1063        TcpListener(inner)
1064    }
1065}
1066
1067impl IntoInner<net_imp::TcpListener> for TcpListener {
1068    fn into_inner(self) -> net_imp::TcpListener {
1069        self.0
1070    }
1071}
1072
1073#[stable(feature = "rust1", since = "1.0.0")]
1074impl fmt::Debug for TcpListener {
1075    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1076        self.0.fmt(f)
1077    }
1078}
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy