Convert String to SocketAddr

后端 未结 2 1238
不知归路
不知归路 2021-02-12 22:50

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

相关标签:
2条回答
  • 2021-02-12 23:05

    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.

    0 讨论(0)
  • 2021-02-12 23:05

    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.

    0 讨论(0)
提交回复
热议问题