Struct TcpListener
struct TcpListener(_)
A TCP socket server, listening for connections.
After creating a TcpListener by binding it to a socket address, it listens
for incoming TCP connections. These can be accepted by calling accept or by
iterating over the Incoming iterator returned by [incoming]TcpListener::incoming.
The socket will be closed when the value is dropped.
The Transmission Control Protocol is specified in IETF RFC 793.
Examples
use std::net::{TcpListener, TcpStream};
fn handle_client(stream: TcpStream) {
// ...
}
fn main() -> std::io::Result<()> {
let listener = TcpListener::bind("127.0.0.1:80")?;
// accept connections and process them serially
for stream in listener.incoming() {
handle_client(stream?);
}
Ok(())
}
Implementations
impl TcpListener
fn bind<A: ToSocketAddrs>(addr: A) -> Result<TcpListener>Creates a new
TcpListenerwhich will be bound to the specified address.The returned listener is ready for accepting connections.
Binding with a port number of 0 will request that the OS assigns a port to this listener. The port allocated can be queried via the
TcpListener::local_addrmethod.The address type can be any implementor of
ToSocketAddrstrait. See its documentation for concrete examples.If
addryields multiple addresses,bindwill be attempted with each of the addresses until one succeeds and returns the listener. If none of the addresses succeed in creating a listener, the error returned from the last attempt (the last address) is returned.Examples
Creates a TCP listener bound to
127.0.0.1:80:use std::net::TcpListener; let listener = TcpListener::bind("127.0.0.1:80").unwrap();Creates a TCP listener bound to
127.0.0.1:80. If that fails, create a TCP listener bound to127.0.0.1:443:use std::net::{SocketAddr, TcpListener}; let addrs = [ SocketAddr::from(([127, 0, 0, 1], 80)), SocketAddr::from(([127, 0, 0, 1], 443)), ]; let listener = TcpListener::bind(&addrs[..]).unwrap();Creates a TCP listener bound to a port assigned by the operating system at
127.0.0.1.use std::net::TcpListener; let socket = TcpListener::bind("127.0.0.1:0").unwrap();fn local_addr(self: &Self) -> Result<SocketAddr>Returns the local socket address of this listener.
Examples
use std::net::{Ipv4Addr, SocketAddr, SocketAddrV4, TcpListener}; let listener = TcpListener::bind("127.0.0.1:8080").unwrap(); assert_eq!(listener.local_addr().unwrap(), SocketAddr::V4(SocketAddrV4::new(Ipv4Addr::new(127, 0, 0, 1), 8080)));fn try_clone(self: &Self) -> Result<TcpListener>Creates a new independently owned handle to the underlying socket.
The returned
TcpListeneris a reference to the same socket that this object references. Both handles can be used to accept incoming connections and options set on one listener will affect the other.Examples
use std::net::TcpListener; let listener = TcpListener::bind("127.0.0.1:8080").unwrap(); let listener_clone = listener.try_clone().unwrap();fn accept(self: &Self) -> Result<(TcpStream, SocketAddr)>Accept a new incoming connection from this listener.
This function will block the calling thread until a new TCP connection is established. When established, the corresponding
TcpStreamand the remote peer's address will be returned.Examples
use std::net::TcpListener; let listener = TcpListener::bind("127.0.0.1:8080").unwrap(); match listener.accept() { Ok((_socket, addr)) => println!("new client: {addr:?}"), Err(e) => println!("couldn't get client: {e:?}"), }fn incoming(self: &Self) -> Incoming<'_>Returns an iterator over the connections being received on this listener.
The returned iterator will never return
Noneand will also not yield the peer'sSocketAddrstructure. Iterating over it is equivalent to callingTcpListener::acceptin a loop.Examples
use std::net::{TcpListener, TcpStream}; fn handle_connection(stream: TcpStream) { //... } fn main() -> std::io::Result<()> { let listener = TcpListener::bind("127.0.0.1:80")?; for stream in listener.incoming() { match stream { Ok(stream) => { handle_connection(stream); } Err(e) => { /* connection failed */ } } } Ok(()) }fn into_incoming(self: Self) -> IntoIncomingTurn this into an iterator over the connections being received on this listener.
The returned iterator will never return
Noneand will also not yield the peer'sSocketAddrstructure. Iterating over it is equivalent to callingTcpListener::acceptin a loop.Examples
#![feature(tcplistener_into_incoming)] use std::net::{TcpListener, TcpStream}; fn listen_on(port: u16) -> impl Iterator<Item = TcpStream> { let listener = TcpListener::bind(("127.0.0.1", port)).unwrap(); listener.into_incoming() .filter_map(Result::ok) /* Ignore failed connections */ } fn main() -> std::io::Result<()> { for stream in listen_on(80) { /* handle the connection here */ } Ok(()) }fn set_ttl(self: &Self, ttl: u32) -> Result<()>Sets the value for the
IP_TTLoption on this socket.This value sets the time-to-live field that is used in every packet sent from this socket.
Examples
use std::net::TcpListener; let listener = TcpListener::bind("127.0.0.1:80").unwrap(); listener.set_ttl(100).expect("could not set TTL");fn ttl(self: &Self) -> Result<u32>Gets the value of the
IP_TTLoption for this socket.For more information about this option, see
TcpListener::set_ttl.Examples
use std::net::TcpListener; let listener = TcpListener::bind("127.0.0.1:80").unwrap(); listener.set_ttl(100).expect("could not set TTL"); assert_eq!(listener.ttl().unwrap_or(0), 100);fn set_only_v6(self: &Self, only_v6: bool) -> Result<()>fn only_v6(self: &Self) -> Result<bool>fn take_error(self: &Self) -> Result<Option<Error>>Gets the value of the
SO_ERRORoption on this socket.This will retrieve the stored error in the underlying socket, clearing the field in the process. This can be useful for checking errors between calls.
Examples
use std::net::TcpListener; let listener = TcpListener::bind("127.0.0.1:80").unwrap(); listener.take_error().expect("No error was expected");fn set_nonblocking(self: &Self, nonblocking: bool) -> Result<()>Moves this TCP stream into or out of nonblocking mode.
This will result in the
acceptoperation becoming nonblocking, i.e., immediately returning from their calls. If the IO operation is successful,Okis returned and no further action is required. If the IO operation could not be completed and needs to be retried, an error with kindio::ErrorKind::WouldBlockis returned.On Unix platforms, calling this method corresponds to calling
fcntlFIONBIO. On Windows calling this method corresponds to callingioctlsocketFIONBIO.Examples
Bind a TCP listener to an address, listen for connections, and read bytes in nonblocking mode:
use std::io; use std::net::TcpListener; let listener = TcpListener::bind("127.0.0.1:7878").unwrap(); listener.set_nonblocking(true).expect("Cannot set non-blocking"); # fn wait_for_fd() { unimplemented!() } # fn handle_connection(stream: std::net::TcpStream) { unimplemented!() } for stream in listener.incoming() { match stream { Ok(s) => { // do something with the TcpStream handle_connection(s); } Err(ref e) if e.kind() == io::ErrorKind::WouldBlock => { // wait until network socket is ready, typically implemented // via platform-specific APIs such as epoll or IOCP wait_for_fd(); continue; } Err(e) => panic!("encountered IO error: {e}"), } }
impl AsFd for TcpListener
fn as_fd(self: &Self) -> BorrowedFd<'_>
impl AsRawFd for TcpListener
fn as_raw_fd(self: &Self) -> RawFd
impl AsRawSocket for TcpListener
fn as_raw_socket(self: &Self) -> RawSocket
impl AsSocket for TcpListener
fn as_socket(self: &Self) -> BorrowedSocket<'_>
impl Debug for TcpListener
fn fmt(self: &Self, f: &mut Formatter<'_>) -> Result
impl Freeze for TcpListener
impl From for TcpListener
fn from(owned_fd: OwnedFd) -> Self
impl From for TcpListener
fn from(owned: OwnedSocket) -> Self
impl FromRawFd for TcpListener
unsafe fn from_raw_fd(fd: RawFd) -> TcpListener
impl FromRawSocket for TcpListener
unsafe fn from_raw_socket(sock: RawSocket) -> TcpListener
impl IntoRawFd for TcpListener
fn into_raw_fd(self: Self) -> RawFd
impl IntoRawSocket for TcpListener
fn into_raw_socket(self: Self) -> RawSocket
impl RefUnwindSafe for TcpListener
impl Send for TcpListener
impl Sync for TcpListener
impl Unpin for TcpListener
impl UnsafeUnpin for TcpListener
impl UnwindSafe for TcpListener
impl<T> Any for TcpListener
fn type_id(self: &Self) -> TypeId
impl<T> Borrow for TcpListener
fn borrow(self: &Self) -> &T
impl<T> BorrowMut for TcpListener
fn borrow_mut(self: &mut Self) -> &mut T
impl<T> From for TcpListener
fn from(t: T) -> TReturns the argument unchanged.
impl<T, U> Into for TcpListener
fn into(self: Self) -> UCalls
U::from(self).That is, this conversion is whatever the implementation of
[From]<T> for Uchooses to do.
impl<T, U> TryFrom for TcpListener
fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>
impl<T, U> TryInto for TcpListener
fn try_into(self: Self) -> Result<U, <U as TryFrom<T>>::Error>