在1.0之前的Rust版本中,我能够使用from_str()
将String
转换为SocketAddr
,但该功能不再存在。我怎么能在Rust 1.0中做到这一点。?
let server_details = reader.read_line().ok().expect("Something went wrong").as_slice().trim();
let server: SocketAddr = from_str(server_details);
let mut s = BufferedStream::new((TcpStream::connect(server).unwrap()));
答案 0 :(得分:11)
from_str
已重命名为parse
,现在是您可以调用字符串的方法:
use std::net::SocketAddr;
fn main() {
let server_details = "127.0.0.1:80";
let server: SocketAddr = server_details
.parse()
.expect("Unable to parse socket address");
println!("{:?}", server);
}
如果您希望能够解析DNS条目到IPv {4,6}地址,您可能需要使用ToSocketAddrs
:
use std::net::{TcpStream, ToSocketAddrs};
fn main() {
let server_details = "stackoverflow.com:80";
let server: Vec<_> = server_details
.to_socket_addrs()
.expect("Unable to resolve domain")
.collect();
println!("{:?}", server);
// Even easier, if you want to connect right away:
TcpStream::connect(server_details).expect("Unable to connect to server");
}
to_socket_addrs
返回一个迭代器,因为单个DNS条目可以扩展为多个 IP地址!请注意,此代码在playground中无效,因为此处禁用了网络访问;你需要在当地尝试一下。
答案 1 :(得分:3)
如果您想立即连接,我将展开&#34;&#34;在Shepmaster的回答中发表评论。
请注意,您并不需要提前将字符串转换为SocketAddr
才能连接到某些内容。 TcpStream::connect()
和其他采用地址的函数被定义为接受ToSocketAddr
特征的实例:
fn connect<T: ToSocketAddr>(addr: T) -> TcpStream { ... }
这意味着您只需将字符串传递给connect()
,无需任何转换:
TcpStream::connect("stackoverflow.com:80")
此外,更好不提前将字符串转换为SocketAddr
,因为域名可以解析为多个地址,TcpStream
具有处理此问题的特殊逻辑