本文簡要介紹rust語言中 Trait std::net::ToSocketAddrs
的用法。
用法
pub trait ToSocketAddrs {
type Iter: Iterator<Item = SocketAddr>;
fn to_socket_addrs(&self) -> Result<Self::Iter>;
}
可以轉換或解析為一個或多個 SocketAddr
值的對象的特征。
此特征用於構造網絡對象時的通用地址解析。默認情況下,它針對以下類型實現:
-
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
值。
這個特性允許構建網絡對象,例如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 ToString.to_string用法及代碼示例
- Rust ToOwned.to_owned用法及代碼示例
- Rust ToOwned.clone_into用法及代碼示例
- Rust TcpStream.local_addr用法及代碼示例
- Rust TcpStream.peer_addr用法及代碼示例
- Rust TcpListener.take_error用法及代碼示例
- Rust Take.limit用法及代碼示例
- Rust TcpStream.set_nodelay用法及代碼示例
- Rust TcpStream.nodelay用法及代碼示例
- Rust TcpListener.into_incoming用法及代碼示例
- Rust TcpStream.take_error用法及代碼示例
- Rust TcpListener.accept用法及代碼示例
- Rust ThreadId用法及代碼示例
- Rust TryIter用法及代碼示例
- Rust Take.set_limit用法及代碼示例
- Rust Try.from_output用法及代碼示例
- Rust Try用法及代碼示例
- Rust TryFrom用法及代碼示例
- Rust Thread.unpark用法及代碼示例
- Rust TcpStream.write_timeout用法及代碼示例
- Rust TcpListener.local_addr用法及代碼示例
- Rust Take.get_ref用法及代碼示例
- Rust TcpStream.peek用法及代碼示例
- Rust TcpStream.set_write_timeout用法及代碼示例
- Rust TcpListener.ttl用法及代碼示例
注:本文由純淨天空篩選整理自rust-lang.org大神的英文原創作品 Trait std::net::ToSocketAddrs。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。