2015-01-31 16 views
5

W wersjach Rust przed 1.0, mogłem użyć from_str() do konwersji String na SocketAddr, ale ta funkcja już nie istnieje. Jak mogę to zrobić w Rust 1.0?Konwertuj ciąg na SocketAddr

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

Odpowiedz

8

from_str został przemianowany na parse a obecnie jest metoda można zadzwonić na smyczki:

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

Jeśli chcesz, aby móc wpisów DNS rozstrzygają do IPV {4,6 } adresy, można użyć 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 zwraca iterator jako śpiewać Wpis DNS może rozwinąć się do wielu adresów IP! Zauważ, że ten kod nie zadziała w Playground, ponieważ dostęp do sieci jest tam wyłączony; musisz go wypróbować lokalnie.

+0

Dziękujemy! Działa świetnie! – user3746744

3

W odpowiedzi na pytanie Shepmastera zajmiemy się komentarzem "jeśli chcesz połączyć się natychmiast".

Pamiętaj, że nie musisz z góry konwertować ciągu znaków na SocketAddr, aby połączyć się z czymś. TcpStream::connect() i inne funkcje, które biorą adresy są zdefiniowane przyjąć wystąpienie ToSocketAddr cechy:

fn connect<T: ToSocketAddr>(addr: T) -> TcpStream { ... } 

Oznacza to, że można po prostu przejść przez ciąg connect() bez konwersji:

TcpStream::connect("stackoverflow.com:80") 

Ponadto jest lepiej nie konwertować ciągu znaków na SocketAddr z góry, ponieważ nazwy domen mogą być rozdzielone na wiele adresów, a TcpStream ma specjalną logikę, aby sobie z tym poradzić.

+0

Łańcuch jest hostem: port combo ze stdin. Adres zmieniałby się za każdym razem. Jestem prawie pewien, że musi zostać przekonwertowany. – user3746744

+0

Przepraszam, ale nie rozumiem, co masz na myśli. Nie musisz wywoływać 'to_socket_addr()' ręcznie, gdy chcesz po prostu połączyć się z czymś. I co masz na myśli mówiąc o zmianie adresu za każdym razem? –