当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Rust ToSocketAddrs用法及代码示例


本文简要介绍rust语言中 Trait std::net::ToSocketAddrs 的用法。

用法

pub trait ToSocketAddrs {
    type Iter: Iterator<Item = SocketAddr>;
    fn to_socket_addrs(&self) -> Result<Self::Iter>;
}

可以转换或解析为一个或多个 SocketAddr 值的对象的特征。

此特征用于构造网络对象时的通用地址解析。默认情况下,它针对以下类型实现:

这个特性允许构建网络对象,例如std::net::TcpStream或者std::net::UdpSocket轻松使用绑定/连接地址的各种类型的值。这是需要的,因为有时一种类型比另一种类型更合适:对于简单的使用,像这样的字符串"localhost:12345"比手动构建相应的要好得多std::net::SocketAddr, 但是有时std::net::SocketAddr值为 地址的主要来源,并将其转换为其他类型(例如字符串),以便将其转换回std::net::SocketAddr在构造函数方法中是没有意义的。

操作系统返回的不是 IP 地址的地址会被静默忽略。

例子

创建一个产生一项的 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());

从主机名创建 SocketAddr 迭代器:

use std::net::{SocketAddr, ToSocketAddrs};

// assuming 'localhost' resolves to 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());

// assuming 'foo' does not resolve
assert!("foo:443".to_socket_addrs().is_err());

创建产生多个项目的 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());

尝试从格式不正确的套接字地址 &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);

TcpStream::connect 是一个函数示例,该函数利用 ToSocketAddrs 作为其参数上的特征,以便接受不同的类型:

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));

相关用法


注:本文由纯净天空筛选整理自rust-lang.org大神的英文原创作品 Trait std::net::ToSocketAddrs。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。