diff options
author | Carl Lerche <me@carllerche.com> | 2019-08-28 13:25:50 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-08-28 13:25:50 -0700 |
commit | fc1640891e1cb4a2bf1ab032452e0e3ef6daf22c (patch) | |
tree | 8433e21e228ef14986e3d22777949e658ddee5ff /tokio | |
parent | de9f05d4d3325a281ddb40adf103fa2b4bba7ee6 (diff) |
net: perform DNS lookup on connect / bind. (#1499)
A sealed `net::ToSocketAddrs` trait is added. This trait is not intended
to be used by users. Instead, it is an argument to `connect` and `bind`
functions.
The operating system's DNS lookup functionality is used. Blocking
operations are performed on a thread pool in order to avoid blocking the
runtime.
Diffstat (limited to 'tokio')
-rw-r--r-- | tokio/examples/chat.rs | 3 | ||||
-rw-r--r-- | tokio/examples/connect.rs | 8 | ||||
-rw-r--r-- | tokio/examples/echo-udp.rs | 3 | ||||
-rw-r--r-- | tokio/examples/echo.rs | 4 | ||||
-rw-r--r-- | tokio/examples/hello_world.rs | 5 | ||||
-rw-r--r-- | tokio/examples/print_each_packet.rs | 8 | ||||
-rw-r--r-- | tokio/examples/proxy.rs | 13 | ||||
-rw-r--r-- | tokio/examples/tinydb.rs | 5 | ||||
-rw-r--r-- | tokio/examples/tinyhttp.rs | 5 | ||||
-rw-r--r-- | tokio/examples/udp-client.rs | 4 | ||||
-rw-r--r-- | tokio/examples/udp-codec.rs | 5 | ||||
-rw-r--r-- | tokio/src/executor.rs | 4 | ||||
-rw-r--r-- | tokio/src/lib.rs | 3 | ||||
-rw-r--r-- | tokio/src/runtime/mod.rs | 8 | ||||
-rw-r--r-- | tokio/tests/buffered.rs | 3 | ||||
-rw-r--r-- | tokio/tests/reactor.rs | 3 | ||||
-rw-r--r-- | tokio/tests/runtime_current_thread.rs | 3 | ||||
-rw-r--r-- | tokio/tests/runtime_threaded.rs | 7 |
18 files changed, 34 insertions, 60 deletions
diff --git a/tokio/examples/chat.rs b/tokio/examples/chat.rs index 8ace878c..719a2530 100644 --- a/tokio/examples/chat.rs +++ b/tokio/examples/chat.rs @@ -45,12 +45,11 @@ async fn main() -> Result<(), Box<dyn Error>> { let state = Lock::new(Shared::new()); let addr = env::args().nth(1).unwrap_or("127.0.0.1:6142".to_string()); - let addr = addr.parse::<SocketAddr>()?; // Bind a TCP listener to the socket address. // // Note that this is the Tokio TcpListener, which is fully async. - let mut listener = TcpListener::bind(&addr)?; + let mut listener = TcpListener::bind(&addr).await?; println!("server running on {}", addr); diff --git a/tokio/examples/connect.rs b/tokio/examples/connect.rs index 6036eec3..0ba8a6f2 100644 --- a/tokio/examples/connect.rs +++ b/tokio/examples/connect.rs @@ -126,13 +126,13 @@ mod udp { // We'll bind our UDP socket to a local IP/port, but for now we // basically let the OS pick both of those. let bind_addr = if addr.ip().is_ipv4() { - "0.0.0.0:0".parse()? + "0.0.0.0:0" } else { - "[::]:0".parse()? + "[::]:0" }; - let socket = UdpSocket::bind(&bind_addr)?; - socket.connect(addr)?; + let socket = UdpSocket::bind(&bind_addr).await?; + socket.connect(addr).await?; let (mut r, mut w) = socket.split(); future::try_join(send(stdin, &mut w), recv(stdout, &mut r)).await?; diff --git a/tokio/examples/echo-udp.rs b/tokio/examples/echo-udp.rs index 330a3cd8..f1e8134d 100644 --- a/tokio/examples/echo-udp.rs +++ b/tokio/examples/echo-udp.rs @@ -52,9 +52,8 @@ impl Server { #[tokio::main] async fn main() -> Result<(), Box<dyn Error>> { let addr = env::args().nth(1).unwrap_or("127.0.0.1:8080".to_string()); - let addr = addr.parse::<SocketAddr>()?; - let socket = UdpSocket::bind(&addr)?; + let socket = UdpSocket::bind(&addr).await?; println!("Listening on: {}", socket.local_addr()?); let server = Server { diff --git a/tokio/examples/echo.rs b/tokio/examples/echo.rs index c8842b73..455aebde 100644 --- a/tokio/examples/echo.rs +++ b/tokio/examples/echo.rs @@ -27,7 +27,6 @@ use tokio::net::TcpListener; use std::env; use std::error::Error; -use std::net::SocketAddr; #[tokio::main] async fn main() -> Result<(), Box<dyn Error>> { @@ -35,12 +34,11 @@ async fn main() -> Result<(), Box<dyn Error>> { // program, but otherwise we'll just set up our TCP listener on // 127.0.0.1:8080 for connections. let addr = env::args().nth(1).unwrap_or("127.0.0.1:8080".to_string()); - let addr = addr.parse::<SocketAddr>()?; // Next up we create a TCP listener which will listen for incoming // connections. This TCP listener is bound to the address we determined // above and must be associated with an event loop. - let mut listener = TcpListener::bind(&addr)?; + let mut listener = TcpListener::bind(&addr).await?; println!("Listening on: {}", addr); loop { diff --git a/tokio/examples/hello_world.rs b/tokio/examples/hello_world.rs index 69c3b3f6..8ff40902 100644 --- a/tokio/examples/hello_world.rs +++ b/tokio/examples/hello_world.rs @@ -13,7 +13,6 @@ #![warn(rust_2018_idioms)] -use tokio; use tokio::io::AsyncWriteExt; use tokio::net::TcpStream; @@ -21,12 +20,10 @@ use std::error::Error; #[tokio::main] pub async fn main() -> Result<(), Box<dyn Error>> { - let addr = "127.0.0.1:6142".parse()?; - // Open a TCP stream to the socket address. // // Note that this is the Tokio TcpStream, which is fully async. - let mut stream = TcpStream::connect(&addr).await?; + let mut stream = TcpStream::connect("127.0.0.1:6142").await?; println!("created stream"); let result = stream.write(b"hello world\n").await; diff --git a/tokio/examples/print_each_packet.rs b/tokio/examples/print_each_packet.rs index b801ac8b..3729c3e9 100644 --- a/tokio/examples/print_each_packet.rs +++ b/tokio/examples/print_each_packet.rs @@ -54,28 +54,26 @@ #![warn(rust_2018_idioms)] -use std::env; -use std::net::SocketAddr; - use tokio; use tokio::codec::{BytesCodec, Decoder}; use tokio::net::TcpListener; use tokio::prelude::*; +use std::env; + #[tokio::main] async fn main() -> Result<(), Box<dyn std::error::Error>> { // Allow passing an address to listen on as the first argument of this // program, but otherwise we'll just set up our TCP listener on // 127.0.0.1:8080 for connections. let addr = env::args().nth(1).unwrap_or("127.0.0.1:8080".to_string()); - let addr = addr.parse::<SocketAddr>()?; // Next up we create a TCP listener which will listen for incoming // connections. This TCP listener is bound to the address we determined // above and must be associated with an event loop, so we pass in a handle // to our event loop. After the socket's created we inform that we're ready // to go and start accepting connections. - let mut listener = TcpListener::bind(&addr)?; + let mut listener = TcpListener::bind(&addr).await?; println!("Listening on: {}", addr); loop { diff --git a/tokio/examples/proxy.rs b/tokio/examples/proxy.rs index 848c0a40..7946be8a 100644 --- a/tokio/examples/proxy.rs +++ b/tokio/examples/proxy.rs @@ -23,7 +23,7 @@ #![warn(rust_2018_idioms)] use futures::{future::try_join, FutureExt, StreamExt}; -use std::{env, error::Error, net::SocketAddr}; +use std::{env, error::Error}; use tokio::{ io::AsyncReadExt, net::{TcpListener, TcpStream}, @@ -32,18 +32,15 @@ use tokio::{ #[tokio::main] async fn main() -> Result<(), Box<dyn Error>> { let listen_addr = env::args().nth(1).unwrap_or("127.0.0.1:8081".to_string()); - let listen_addr = listen_addr.parse::<SocketAddr>()?; - let server_addr = env::args().nth(2).unwrap_or("127.0.0.1:8080".to_string()); - let server_addr = server_addr.parse::<SocketAddr>()?; println!("Listening on: {}", listen_addr); println!("Proxying to: {}", server_addr); - let mut incoming = TcpListener::bind(&listen_addr)?.incoming(); + let mut incoming = TcpListener::bind(listen_addr).await?.incoming(); while let Some(Ok(inbound)) = incoming.next().await { - let transfer = transfer(inbound, server_addr).map(|r| { + let transfer = transfer(inbound, server_addr.clone()).map(|r| { if let Err(e) = r { println!("Failed to transfer; error={}", e); } @@ -55,8 +52,8 @@ async fn main() -> Result<(), Box<dyn Error>> { Ok(()) } -async fn transfer(inbound: TcpStream, proxy_addr: SocketAddr) -> Result<(), Box<dyn Error>> { - let outbound = TcpStream::connect(&proxy_addr).await?; +async fn transfer(inbound: TcpStream, proxy_addr: String) -> Result<(), Box<dyn Error>> { + let outbound = TcpStream::connect(proxy_addr).await?; let (mut ri, mut wi) = inbound.split(); let (mut ro, mut wo) = outbound.split(); diff --git a/tokio/examples/tinydb.rs b/tokio/examples/tinydb.rs index fa3cefee..be4951dc 100644 --- a/tokio/examples/tinydb.rs +++ b/tokio/examples/tinydb.rs @@ -44,7 +44,6 @@ use std::collections::HashMap; use std::env; use std::error::Error; -use std::net::SocketAddr; use std::sync::{Arc, Mutex}; use tokio; @@ -88,8 +87,8 @@ async fn main() -> Result<(), Box<dyn Error>> { // Parse the address we're going to run this server on // and set up our TCP listener to accept connections. let addr = env::args().nth(1).unwrap_or("127.0.0.1:8080".to_string()); - let addr = addr.parse::<SocketAddr>()?; - let mut listener = TcpListener::bind(&addr)?; + + let mut listener = TcpListener::bind(&addr).await?; println!("Listening on: {}", addr); // Create the shared state of this server that will be shared amongst all diff --git a/tokio/examples/tinyhttp.rs b/tokio/examples/tinyhttp.rs index 6aa5a183..65074018 100644 --- a/tokio/examples/tinyhttp.rs +++ b/tokio/examples/tinyhttp.rs @@ -17,7 +17,7 @@ use bytes::BytesMut; use futures::{SinkExt, StreamExt}; use http::{header::HeaderValue, Request, Response, StatusCode}; use serde::Serialize; -use std::{env, error::Error, fmt, io, net::SocketAddr}; +use std::{env, error::Error, fmt, io}; use tokio::{ codec::{Decoder, Encoder, Framed}, net::{TcpListener, TcpStream}, @@ -28,9 +28,8 @@ async fn main() -> Result<(), Box<dyn Error>> { // Parse the arguments, bind the TCP socket we'll be listening to, spin up // our worker threads, and start shipping sockets to those worker threads. let addr = env::args().nth(1).unwrap_or("127.0.0.1:8080".to_string()); - let addr = addr.parse::<SocketAddr>()?; - let mut incoming = TcpListener::bind(&addr)?.incoming(); + let mut incoming = TcpListener::bind(&addr).await?.incoming(); println!("Listening on: {}", addr); while let Some(Ok(stream)) = incoming.next().await { diff --git a/tokio/examples/udp-client.rs b/tokio/examples/udp-client.rs index 915c06d9..5437daf6 100644 --- a/tokio/examples/udp-client.rs +++ b/tokio/examples/udp-client.rs @@ -55,9 +55,9 @@ async fn main() -> Result<(), Box<dyn Error>> { } .parse()?; - let mut socket = UdpSocket::bind(&local_addr)?; + let mut socket = UdpSocket::bind(local_addr).await?; const MAX_DATAGRAM_SIZE: usize = 65_507; - socket.connect(&remote_addr)?; + socket.connect(&remote_addr).await?; let data = get_stdin_data()?; socket.send(&data).await?; let mut data = vec![0u8; MAX_DATAGRAM_SIZE]; diff --git a/tokio/examples/udp-codec.rs b/tokio/examples/udp-codec.rs index c055eaa4..7d0aaf69 100644 --- a/tokio/examples/udp-codec.rs +++ b/tokio/examples/udp-codec.rs @@ -27,11 +27,10 @@ async fn main() -> Result<(), Box<dyn Error>> { let _ = env_logger::init(); let addr = env::args().nth(1).unwrap_or("127.0.0.1:0".to_string()); - let addr = addr.parse::<SocketAddr>()?; // Bind both our sockets and then figure out what ports we got. - let a = UdpSocket::bind(&addr)?; - let b = UdpSocket::bind(&addr)?; + let a = UdpSocket::bind(&addr).await?; + let b = UdpSocket::bind(&addr).await?; let b_addr = b.local_addr()?; diff --git a/tokio/src/executor.rs b/tokio/src/executor.rs index 7026cd63..75f0f9d4 100644 --- a/tokio/src/executor.rs +++ b/tokio/src/executor.rs @@ -73,8 +73,7 @@ pub struct Spawn(()); /// /// # async fn process<T>(t: T) {} /// # async fn dox() -> Result<(), Box<dyn std::error::Error>> { -/// let addr = "127.0.0.1:8080".parse()?; -/// let mut listener = TcpListener::bind(&addr).unwrap(); +/// let mut listener = TcpListener::bind("127.0.0.1:8080").await?; /// /// loop { /// let (socket, _) = listener.accept().await?; @@ -84,7 +83,6 @@ pub struct Spawn(()); /// process(socket).await /// }); /// } -/// # Ok(()) /// # } /// ``` /// diff --git a/tokio/src/lib.rs b/tokio/src/lib.rs index 2c804c77..7ddcefdf 100644 --- a/tokio/src/lib.rs +++ b/tokio/src/lib.rs @@ -35,8 +35,7 @@ //! //! #[tokio::main] //! async fn main() -> Result<(), Box<dyn std::error::Error>> { -//! let addr = "127.0.0.1:8080".parse()?; -//! let mut listener = TcpListener::bind(&addr).unwrap(); +//! let mut listener = TcpListener::bind("127.0.0.1:8080").await?; //! //! loop { //! let (mut socket, _) = listener.accept().await?; diff --git a/tokio/src/runtime/mod.rs b/tokio/src/runtime/mod.rs index 9b630d87..4ba6663a 100644 --- a/tokio/src/runtime/mod.rs +++ b/tokio/src/runtime/mod.rs @@ -39,8 +39,7 @@ //! //! #[tokio::main] //! async fn main() -> Result<(), Box<dyn std::error::Error>> { -//! let addr = "127.0.0.1:8080".parse()?; -//! let mut listener = TcpListener::bind(&addr).unwrap(); +//! let mut listener = TcpListener::bind("127.0.0.1:8080").await?; //! //! loop { //! let (mut socket, _) = listener.accept().await?; @@ -87,12 +86,11 @@ //! //! fn main() -> Result<(), Box<dyn std::error::Error>> { //! // Create the runtime -//! let mut rt = Runtime::new().unwrap(); +//! let mut rt = Runtime::new()?; //! //! // Spawn the root task //! rt.block_on(async { -//! let addr = "127.0.0.1:8080".parse()?; -//! let mut listener = TcpListener::bind(&addr).unwrap(); +//! let mut listener = TcpListener::bind("127.0.0.1:8080").await?; //! //! loop { //! let (mut socket, _) = listener.accept().await?; diff --git a/tokio/tests/buffered.rs b/tokio/tests/buffered.rs index 351cb30a..fe419099 100644 --- a/tokio/tests/buffered.rs +++ b/tokio/tests/buffered.rs @@ -13,8 +13,7 @@ use std::thread; async fn echo_server() { const N: usize = 1024; - let addr = assert_ok!("127.0.0.1:0".parse()); - let mut srv = assert_ok!(TcpListener::bind(&addr)); + let mut srv = assert_ok!(TcpListener::bind("127.0.0.1:0").await); let addr = assert_ok!(srv.local_addr()); let msg = "foo bar baz"; diff --git a/tokio/tests/reactor.rs b/tokio/tests/reactor.rs index 59ff8128..f1ed8703 100644 --- a/tokio/tests/reactor.rs +++ b/tokio/tests/reactor.rs @@ -50,9 +50,8 @@ fn test_drop_on_notify() { // Define a task that just drains the listener let task = Arc::new(Task::new(async move { - let addr = assert_ok!("127.0.0.1:0".parse()); // Create a listener - let mut listener = assert_ok!(TcpListener::bind(&addr)); + let mut listener = assert_ok!(TcpListener::bind("127.0.0.1:0").await); // Send the address let addr = listener.local_addr().unwrap(); diff --git a/tokio/tests/runtime_current_thread.rs b/tokio/tests/runtime_current_thread.rs index 9f77ac7c..ff742707 100644 --- a/tokio/tests/runtime_current_thread.rs +++ b/tokio/tests/runtime_current_thread.rs @@ -13,8 +13,7 @@ use std::time::{Duration, Instant}; use tokio::timer::delay; async fn client_server(tx: mpsc::Sender<()>) { - let addr = assert_ok!("127.0.0.1:0".parse()); - let mut server = assert_ok!(TcpListener::bind(&addr)); + let mut server = assert_ok!(TcpListener::bind("127.0.0.1:0").await); // Get the assigned address let addr = assert_ok!(server.local_addr()); diff --git a/tokio/tests/runtime_threaded.rs b/tokio/tests/runtime_threaded.rs index bd8ce6a0..36f652dd 100644 --- a/tokio/tests/runtime_threaded.rs +++ b/tokio/tests/runtime_threaded.rs @@ -15,8 +15,7 @@ use std::thread; use std::time::{Duration, Instant}; async fn client_server(tx: mpsc::Sender<()>) { - let addr = assert_ok!("127.0.0.1:0".parse()); - let mut server = assert_ok!(TcpListener::bind(&addr)); + let mut server = assert_ok!(TcpListener::bind("127.0.0.1:0").await); // Get the assigned address let addr = assert_ok!(server.local_addr()); @@ -78,11 +77,9 @@ fn block_on_socket() { let rt = Runtime::new().unwrap(); rt.block_on(async move { - let addr = "127.0.0.1:0".parse().unwrap(); - let (tx, rx) = oneshot::channel(); - let mut listener = TcpListener::bind(&addr).unwrap(); + let mut listener = TcpListener::bind("127.0.0.1:0").await.unwrap(); let addr = listener.local_addr().unwrap(); tokio::spawn(async move { |