1use crate::io::{Interest, PollEvented};
2use crate::net::tcp::TcpStream;
3
4cfg_not_wasi! {
5 use crate::net::{to_socket_addrs, ToSocketAddrs};
6}
7
8use std::fmt;
9use std::io;
10use std::net::{self, SocketAddr};
11use std::task::{Context, Poll};
12
13cfg_net! {
14 /// A TCP socket server, listening for connections.
15 ///
16 /// You can accept a new connection by using the [`accept`](`TcpListener::accept`)
17 /// method.
18 ///
19 /// A `TcpListener` can be turned into a `Stream` with [`TcpListenerStream`].
20 ///
21 /// [`TcpListenerStream`]: https://docs.rs/tokio-stream/0.1/tokio_stream/wrappers/struct.TcpListenerStream.html
22 ///
23 /// # Errors
24 ///
25 /// Note that accepting a connection can lead to various errors and not all
26 /// of them are necessarily fatal ‒ for example having too many open file
27 /// descriptors or the other side closing the connection while it waits in
28 /// an accept queue. These would terminate the stream if not handled in any
29 /// way.
30 ///
31 /// # Examples
32 ///
33 /// Using `accept`:
34 /// ```no_run
35 /// use tokio::net::TcpListener;
36 ///
37 /// use std::io;
38 ///
39 /// async fn process_socket<T>(socket: T) {
40 /// # drop(socket);
41 /// // do work with socket here
42 /// }
43 ///
44 /// #[tokio::main]
45 /// async fn main() -> io::Result<()> {
46 /// let listener = TcpListener::bind("127.0.0.1:8080").await?;
47 ///
48 /// loop {
49 /// let (socket, _) = listener.accept().await?;
50 /// process_socket(socket).await;
51 /// }
52 /// }
53 /// ```
54 pub struct TcpListener {
55 io: PollEvented<mio::net::TcpListener>,
56 }
57}
58
59impl TcpListener {
60 cfg_not_wasi! {
61 /// Creates a new TcpListener, which will be bound to the specified address.
62 ///
63 /// The returned listener is ready for accepting connections.
64 ///
65 /// Binding with a port number of 0 will request that the OS assigns a port
66 /// to this listener. The port allocated can be queried via the `local_addr`
67 /// method.
68 ///
69 /// The address type can be any implementor of the [`ToSocketAddrs`] trait.
70 /// If `addr` yields multiple addresses, bind will be attempted with each of
71 /// the addresses until one succeeds and returns the listener. If none of
72 /// the addresses succeed in creating a listener, the error returned from
73 /// the last attempt (the last address) is returned.
74 ///
75 /// This function sets the `SO_REUSEADDR` option on the socket.
76 ///
77 /// To configure the socket before binding, you can use the [`TcpSocket`]
78 /// type.
79 ///
80 /// [`ToSocketAddrs`]: trait@crate::net::ToSocketAddrs
81 /// [`TcpSocket`]: struct@crate::net::TcpSocket
82 ///
83 /// # Examples
84 ///
85 /// ```no_run
86 /// use tokio::net::TcpListener;
87 ///
88 /// use std::io;
89 ///
90 /// #[tokio::main]
91 /// async fn main() -> io::Result<()> {
92 /// let listener = TcpListener::bind("127.0.0.1:2345").await?;
93 ///
94 /// // use the listener
95 ///
96 /// # let _ = listener;
97 /// Ok(())
98 /// }
99 /// ```
100 pub async fn bind<A: ToSocketAddrs>(addr: A) -> io::Result<TcpListener> {
101 let addrs = to_socket_addrs(addr).await?;
102
103 let mut last_err = None;
104
105 for addr in addrs {
106 match TcpListener::bind_addr(addr) {
107 Ok(listener) => return Ok(listener),
108 Err(e) => last_err = Some(e),
109 }
110 }
111
112 Err(last_err.unwrap_or_else(|| {
113 io::Error::new(
114 io::ErrorKind::InvalidInput,
115 "could not resolve to any address",
116 )
117 }))
118 }
119
120 fn bind_addr(addr: SocketAddr) -> io::Result<TcpListener> {
121 let listener = mio::net::TcpListener::bind(addr)?;
122 TcpListener::new(listener)
123 }
124 }
125
126 /// Accepts a new incoming connection from this listener.
127 ///
128 /// This function will yield once a new TCP connection is established. When
129 /// established, the corresponding [`TcpStream`] and the remote peer's
130 /// address will be returned.
131 ///
132 /// # Cancel safety
133 ///
134 /// This method is cancel safe. If the method is used as the event in a
135 /// [`tokio::select!`](crate::select) statement and some other branch
136 /// completes first, then it is guaranteed that no new connections were
137 /// accepted by this method.
138 ///
139 /// [`TcpStream`]: struct@crate::net::TcpStream
140 ///
141 /// # Examples
142 ///
143 /// ```no_run
144 /// use tokio::net::TcpListener;
145 ///
146 /// use std::io;
147 ///
148 /// #[tokio::main]
149 /// async fn main() -> io::Result<()> {
150 /// let listener = TcpListener::bind("127.0.0.1:8080").await?;
151 ///
152 /// match listener.accept().await {
153 /// Ok((_socket, addr)) => println!("new client: {:?}", addr),
154 /// Err(e) => println!("couldn't get client: {:?}", e),
155 /// }
156 ///
157 /// Ok(())
158 /// }
159 /// ```
160 pub async fn accept(&self) -> io::Result<(TcpStream, SocketAddr)> {
161 let (mio, addr) = self
162 .io
163 .registration()
164 .async_io(Interest::READABLE, || self.io.accept())
165 .await?;
166
167 let stream = TcpStream::new(mio)?;
168 Ok((stream, addr))
169 }
170
171 /// Polls to accept a new incoming connection to this listener.
172 ///
173 /// If there is no connection to accept, `Poll::Pending` is returned and the
174 /// current task will be notified by a waker. Note that on multiple calls
175 /// to `poll_accept`, only the `Waker` from the `Context` passed to the most
176 /// recent call is scheduled to receive a wakeup.
177 pub fn poll_accept(&self, cx: &mut Context<'_>) -> Poll<io::Result<(TcpStream, SocketAddr)>> {
178 loop {
179 let ev = ready!(self.io.registration().poll_read_ready(cx))?;
180
181 match self.io.accept() {
182 Ok((io, addr)) => {
183 let io = TcpStream::new(io)?;
184 return Poll::Ready(Ok((io, addr)));
185 }
186 Err(ref e) if e.kind() == io::ErrorKind::WouldBlock => {
187 self.io.registration().clear_readiness(ev);
188 }
189 Err(e) => return Poll::Ready(Err(e)),
190 }
191 }
192 }
193
194 /// Creates new `TcpListener` from a `std::net::TcpListener`.
195 ///
196 /// This function is intended to be used to wrap a TCP listener from the
197 /// standard library in the Tokio equivalent.
198 ///
199 /// This API is typically paired with the `socket2` crate and the `Socket`
200 /// type to build up and customize a listener before it's shipped off to the
201 /// backing event loop. This allows configuration of options like
202 /// `SO_REUSEPORT`, binding to multiple addresses, etc.
203 ///
204 /// # Notes
205 ///
206 /// The caller is responsible for ensuring that the listener is in
207 /// non-blocking mode. Otherwise all I/O operations on the listener
208 /// will block the thread, which will cause unexpected behavior.
209 /// Non-blocking mode can be set using [`set_nonblocking`].
210 ///
211 /// [`set_nonblocking`]: std::net::TcpListener::set_nonblocking
212 ///
213 /// # Examples
214 ///
215 /// ```rust,no_run
216 /// use std::error::Error;
217 /// use tokio::net::TcpListener;
218 ///
219 /// #[tokio::main]
220 /// async fn main() -> Result<(), Box<dyn Error>> {
221 /// let std_listener = std::net::TcpListener::bind("127.0.0.1:0")?;
222 /// std_listener.set_nonblocking(true)?;
223 /// let listener = TcpListener::from_std(std_listener)?;
224 /// Ok(())
225 /// }
226 /// ```
227 ///
228 /// # Panics
229 ///
230 /// This function panics if it is not called from within a runtime with
231 /// IO enabled.
232 ///
233 /// The runtime is usually set implicitly when this function is called
234 /// from a future driven by a tokio runtime, otherwise runtime can be set
235 /// explicitly with [`Runtime::enter`](crate::runtime::Runtime::enter) function.
236 #[track_caller]
237 pub fn from_std(listener: net::TcpListener) -> io::Result<TcpListener> {
238 let io = mio::net::TcpListener::from_std(listener);
239 let io = PollEvented::new(io)?;
240 Ok(TcpListener { io })
241 }
242
243 /// Turns a [`tokio::net::TcpListener`] into a [`std::net::TcpListener`].
244 ///
245 /// The returned [`std::net::TcpListener`] will have nonblocking mode set as
246 /// `true`. Use [`set_nonblocking`] to change the blocking mode if needed.
247 ///
248 /// # Examples
249 ///
250 /// ```rust,no_run
251 /// use std::error::Error;
252 ///
253 /// #[tokio::main]
254 /// async fn main() -> Result<(), Box<dyn Error>> {
255 /// let tokio_listener = tokio::net::TcpListener::bind("127.0.0.1:0").await?;
256 /// let std_listener = tokio_listener.into_std()?;
257 /// std_listener.set_nonblocking(false)?;
258 /// Ok(())
259 /// }
260 /// ```
261 ///
262 /// [`tokio::net::TcpListener`]: TcpListener
263 /// [`std::net::TcpListener`]: std::net::TcpListener
264 /// [`set_nonblocking`]: fn@std::net::TcpListener::set_nonblocking
265 pub fn into_std(self) -> io::Result<std::net::TcpListener> {
266 #[cfg(unix)]
267 {
268 use std::os::unix::io::{FromRawFd, IntoRawFd};
269 self.io
270 .into_inner()
271 .map(IntoRawFd::into_raw_fd)
272 .map(|raw_fd| unsafe { std::net::TcpListener::from_raw_fd(raw_fd) })
273 }
274
275 #[cfg(windows)]
276 {
277 use std::os::windows::io::{FromRawSocket, IntoRawSocket};
278 self.io
279 .into_inner()
280 .map(|io| io.into_raw_socket())
281 .map(|raw_socket| unsafe { std::net::TcpListener::from_raw_socket(raw_socket) })
282 }
283
284 #[cfg(target_os = "wasi")]
285 {
286 use std::os::wasi::io::{FromRawFd, IntoRawFd};
287 self.io
288 .into_inner()
289 .map(|io| io.into_raw_fd())
290 .map(|raw_fd| unsafe { std::net::TcpListener::from_raw_fd(raw_fd) })
291 }
292 }
293
294 cfg_not_wasi! {
295 pub(crate) fn new(listener: mio::net::TcpListener) -> io::Result<TcpListener> {
296 let io = PollEvented::new(listener)?;
297 Ok(TcpListener { io })
298 }
299 }
300
301 /// Returns the local address that this listener is bound to.
302 ///
303 /// This can be useful, for example, when binding to port 0 to figure out
304 /// which port was actually bound.
305 ///
306 /// # Examples
307 ///
308 /// ```rust,no_run
309 /// use tokio::net::TcpListener;
310 ///
311 /// use std::io;
312 /// use std::net::{Ipv4Addr, SocketAddr, SocketAddrV4};
313 ///
314 /// #[tokio::main]
315 /// async fn main() -> io::Result<()> {
316 /// let listener = TcpListener::bind("127.0.0.1:8080").await?;
317 ///
318 /// assert_eq!(listener.local_addr()?,
319 /// SocketAddr::V4(SocketAddrV4::new(Ipv4Addr::new(127, 0, 0, 1), 8080)));
320 ///
321 /// Ok(())
322 /// }
323 /// ```
324 pub fn local_addr(&self) -> io::Result<SocketAddr> {
325 self.io.local_addr()
326 }
327
328 /// Gets the value of the `IP_TTL` option for this socket.
329 ///
330 /// For more information about this option, see [`set_ttl`].
331 ///
332 /// [`set_ttl`]: method@Self::set_ttl
333 ///
334 /// # Examples
335 ///
336 /// ```no_run
337 /// use tokio::net::TcpListener;
338 ///
339 /// use std::io;
340 ///
341 /// #[tokio::main]
342 /// async fn main() -> io::Result<()> {
343 /// let listener = TcpListener::bind("127.0.0.1:0").await?;
344 ///
345 /// listener.set_ttl(100).expect("could not set TTL");
346 /// assert_eq!(listener.ttl()?, 100);
347 ///
348 /// Ok(())
349 /// }
350 /// ```
351 pub fn ttl(&self) -> io::Result<u32> {
352 self.io.ttl()
353 }
354
355 /// Sets the value for the `IP_TTL` option on this socket.
356 ///
357 /// This value sets the time-to-live field that is used in every packet sent
358 /// from this socket.
359 ///
360 /// # Examples
361 ///
362 /// ```no_run
363 /// use tokio::net::TcpListener;
364 ///
365 /// use std::io;
366 ///
367 /// #[tokio::main]
368 /// async fn main() -> io::Result<()> {
369 /// let listener = TcpListener::bind("127.0.0.1:0").await?;
370 ///
371 /// listener.set_ttl(100).expect("could not set TTL");
372 ///
373 /// Ok(())
374 /// }
375 /// ```
376 pub fn set_ttl(&self, ttl: u32) -> io::Result<()> {
377 self.io.set_ttl(ttl)
378 }
379}
380
381impl TryFrom<net::TcpListener> for TcpListener {
382 type Error = io::Error;
383
384 /// Consumes stream, returning the tokio I/O object.
385 ///
386 /// This is equivalent to
387 /// [`TcpListener::from_std(stream)`](TcpListener::from_std).
388 fn try_from(stream: net::TcpListener) -> Result<Self, Self::Error> {
389 Self::from_std(stream)
390 }
391}
392
393impl fmt::Debug for TcpListener {
394 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
395 self.io.fmt(f)
396 }
397}
398
399#[cfg(unix)]
400mod sys {
401 use super::TcpListener;
402 use std::os::unix::prelude::*;
403
404 impl AsRawFd for TcpListener {
405 fn as_raw_fd(&self) -> RawFd {
406 self.io.as_raw_fd()
407 }
408 }
409
410 impl AsFd for TcpListener {
411 fn as_fd(&self) -> BorrowedFd<'_> {
412 unsafe { BorrowedFd::borrow_raw(self.as_raw_fd()) }
413 }
414 }
415}
416
417cfg_unstable! {
418 #[cfg(target_os = "wasi")]
419 mod sys {
420 use super::TcpListener;
421 use std::os::wasi::prelude::*;
422
423 impl AsRawFd for TcpListener {
424 fn as_raw_fd(&self) -> RawFd {
425 self.io.as_raw_fd()
426 }
427 }
428
429 impl AsFd for TcpListener {
430 fn as_fd(&self) -> BorrowedFd<'_> {
431 unsafe { BorrowedFd::borrow_raw(self.as_raw_fd()) }
432 }
433 }
434 }
435}
436
437cfg_windows! {
438 use crate::os::windows::io::{AsRawSocket, RawSocket, AsSocket, BorrowedSocket};
439
440 impl AsRawSocket for TcpListener {
441 fn as_raw_socket(&self) -> RawSocket {
442 self.io.as_raw_socket()
443 }
444 }
445
446 impl AsSocket for TcpListener {
447 fn as_socket(&self) -> BorrowedSocket<'_> {
448 unsafe { BorrowedSocket::borrow_raw(self.as_raw_socket()) }
449 }
450 }
451}
452