Trait std::net::ToSocketAddrs 1.0.0[−][src]
pub trait ToSocketAddrs {
type Iter: Iterator<Item = SocketAddr>;
fn to_socket_addrs(&self) -> Result<Self::Iter>;
}Expand description
可以转换或解析为一个或多个 SocketAddr 值的对象的 trait。
一个用于构建网络对象时的通用地址解析的 trait。默认情况下,它针对以下类型实现:
-
SocketAddr:to_socket_addrs是标识函数。 -
SocketAddrV4,SocketAddrV6,(IpAddr, u16),(Ipv4Addr, u16),(Ipv6Addr, u16):to_socket_addrs简单地构建了一个SocketAddr。 -
(&str, u16):&str应该是FromStr实现所期望的IpAddr地址的字符串表示或主机名。u16是端口号。 -
&str: 该字符串应该是SocketAddr的字符串表示形式,正如其FromStr实现所期望的那样,或者是像<host_name>:<port>这样的字符串,其中<port>是一个u16值。
这个 trait 允许使用 bind/connection 地址的各种类型的值,轻松构建 TcpStream 或 UdpSocket 之类的网络对象。
之所以需要它,是因为有时一种类型比另一种类型更合适:对于简单的用法,像 "localhost:12345" 这样的字符串比相应的 SocketAddr 的手工构造好得多,但是有时 SocketAddr 值是地址的 * 主要来源,并将其转换为其他一些类型 (例如,字符串) 仅用于在构造函数方法中将其转换回 SocketAddr 是没有意义的。
操作系统返回的不是 IP 地址的地址将被静默忽略。
Examples
创建一个产生一个项的 SocketAddr 迭代器:
use std::net::{ToSocketAddrs, SocketAddr};
let addr = SocketAddr::from(([127, 0, 0, 1], 443));
let mut addrs_iter = addr.to_socket_addrs().unwrap();
assert_eq!(Some(addr), addrs_iter.next());
assert!(addrs_iter.next().is_none());Run从主机名创建 SocketAddr 迭代器:
use std::net::{SocketAddr, ToSocketAddrs};
// 假设 'localhost' 解析为 127.0.0.1
let mut addrs_iter = "localhost:443".to_socket_addrs().unwrap();
assert_eq!(addrs_iter.next(), Some(SocketAddr::from(([127, 0, 0, 1], 443))));
assert!(addrs_iter.next().is_none());
// 假设 'foo' 无法解析
assert!("foo:443".to_socket_addrs().is_err());Run创建一个产生多个项的 SocketAddr 迭代器:
use std::net::{SocketAddr, ToSocketAddrs};
let addr1 = SocketAddr::from(([0, 0, 0, 0], 80));
let addr2 = SocketAddr::from(([127, 0, 0, 1], 443));
let addrs = vec![addr1, addr2];
let mut addrs_iter = (&addrs[..]).to_socket_addrs().unwrap();
assert_eq!(Some(addr1), addrs_iter.next());
assert_eq!(Some(addr2), addrs_iter.next());
assert!(addrs_iter.next().is_none());Run尝试从格式不正确的套接字地址 &str (缺少端口) 创建 SocketAddr 迭代器:
use std::io;
use std::net::ToSocketAddrs;
let err = "127.0.0.1".to_socket_addrs().unwrap_err();
assert_eq!(err.kind(), io::ErrorKind::InvalidInput);RunTcpStream::connect 是一个函数的例子,它利用 ToSocketAddrs 作为它的参数上的 trait bound 以接受不同的类型:
use std::net::{TcpStream, Ipv4Addr};
let stream = TcpStream::connect(("127.0.0.1", 443));
// or
let stream = TcpStream::connect("127.0.0.1:443");
// or
let stream = TcpStream::connect((Ipv4Addr::new(127, 0, 0, 1), 443));RunAssociated Types
type Iter: Iterator<Item = SocketAddr>
type Iter: Iterator<Item = SocketAddr>
在此类型可能对应的套接字地址上返回的迭代器。