2015-01-31 19 views
5

Trong phiên bản Rust trước 1.0, tôi đã có thể sử dụng from_str() để chuyển đổi String thành SocketAddr, nhưng chức năng đó không còn tồn tại. Làm thế nào tôi có thể làm điều này trong Rust 1.0.?Chuyển đổi chuỗi thành 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())); 

Trả lời

8

from_str được đổi tên thành parse và bây giờ là một phương pháp bạn có thể gọi trên dây:

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

Nếu bạn muốn để có thể mục DNS quyết để IPV {4,6 địa chỉ}, bạn có thể muốn sử dụng 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 trả về một iterator như một hát Mục nhập le DNS có thể mở rộng đến nhiều địa chỉ IP! Lưu ý rằng mã này sẽ không hoạt động trong Playground vì quyền truy cập mạng bị tắt ở đó; bạn sẽ cần dùng thử tại địa phương.

+0

Cảm ơn bạn! Hoạt động tuyệt vời! – user3746744

3

Tôi sẽ mở rộng trên "nếu bạn muốn kết nối ngay lập tức" nhận xét trong câu trả lời của Shepmaster.

Lưu ý rằng bạn không thực sự cần phải chuyển đổi chuỗi thành số SocketAddr trước để kết nối với thứ gì đó. TcpStream::connect() và các chức năng khác mà lấy địa chỉ được định nghĩa để chấp nhận một thể hiện của ToSocketAddr đặc điểm:

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

Nó có nghĩa là bạn chỉ có thể vượt qua một chuỗi để connect() mà không cần bất kỳ chuyển đổi:

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

Hơn nữa, nó là tốt hơn không được chuyển đổi chuỗi thành SocketAddr trước vì tên miền có thể phân giải thành nhiều địa chỉ và TcpStream có logic đặc biệt để xử lý việc này.

+0

Chuỗi là một máy chủ: kết hợp cổng từ stdin. Địa chỉ sẽ thay đổi mỗi lần. Tôi khá chắc chắn nó cần phải được chuyển đổi. – user3746744

+0

Xin lỗi, nhưng tôi không hiểu ý bạn là gì. Bạn không cần phải gọi 'to_socket_addr()' theo cách thủ công khi bạn chỉ muốn kết nối với một thứ gì đó. Và ý bạn là gì về địa chỉ thay đổi mỗi lần? –

Các vấn đề liên quan