In versions of Rust before 1.0, I was able to use from_str()
to convert a String
to SocketAddr
, but that function no longer exists. How ca
from_str
was renamed to parse and is now a method you can call on strings:
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);
}
If you'd like to be able to resolve DNS entries to IPv{4,6} addresses, you may want to use 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
returns an iterator as a single DNS entry can expand to multiple IP addresses! Note that this code won't work in the playground as network access is disabled there; you'll need to try it out locally.
I'll expand on "if you want to connect right away" comment in Shepmaster's answer.
Note that you don't really need to convert a string to a SocketAddr
in advance in order to connect to something. TcpStream::connect()
and other functions which take addresses are defined to accept an instance of ToSocketAddr
trait:
fn connect<T: ToSocketAddr>(addr: T) -> TcpStream { ... }
It means that you can just pass a string to connect()
without any conversions:
TcpStream::connect("stackoverflow.com:80")
Moreover, it is better not to convert the string to the SocketAddr
in advance because domain names can resolve to multiple addresses, and TcpStream
has special logic to handle this.