blob: c281ec2942b475dc60acfc1e1c8adedae4b4820e [file] [log] [blame]
//! Async networking primitives for TCP/UDP/Unix communication.
//!
//! This crate is an async version of [`std::net`] and [`std::os::unix::net`].
//!
//! # Implementation
//!
//! This crate uses [`async-io`] for async I/O and [`blocking`] for DNS lookups.
//!
//! [`async-io`]: https://docs.rs/async-io
//! [`blocking`]: https://docs.rs/blocking
//!
//! # Examples
//!
//! A simple UDP server that echoes messages back to the sender:
//!
//! ```no_run
//! use async_net::UdpSocket;
//!
//! # futures_lite::future::block_on(async {
//! let socket = UdpSocket::bind("127.0.0.1:8080").await?;
//! let mut buf = vec![0u8; 1024];
//!
//! loop {
//! let (n, addr) = socket.recv_from(&mut buf).await?;
//! socket.send_to(&buf[..n], &addr).await?;
//! }
//! # std::io::Result::Ok(()) });
//! ```
#![forbid(unsafe_code)]
#![warn(missing_docs, missing_debug_implementations, rust_2018_idioms)]
#[cfg(unix)]
pub mod unix;
mod addr;
mod tcp;
mod udp;
pub use addr::AsyncToSocketAddrs;
pub use tcp::{Incoming, TcpListener, TcpStream};
pub use udp::UdpSocket;
use std::io;
#[doc(no_inline)]
pub use std::net::{IpAddr, Ipv4Addr, Ipv6Addr, Shutdown, SocketAddr, SocketAddrV4, SocketAddrV6};
#[doc(no_inline)]
pub use std::net::AddrParseError;
/// Converts or resolves addresses to [`SocketAddr`] values.
///
/// # Examples
///
/// ```
/// # futures_lite::future::block_on(async {
/// for addr in async_net::resolve("google.com:80").await? {
/// println!("{}", addr);
/// }
/// # std::io::Result::Ok(()) });
/// ```
pub async fn resolve<A: AsyncToSocketAddrs>(addr: A) -> io::Result<Vec<SocketAddr>> {
Ok(addr.to_socket_addrs().await?.collect())
}