MST

星途 面试题库

面试题:Rust中TcpStream建立TCP连接时如何处理错误

在Rust里使用TcpStream进行TCP连接,假设连接过程可能出现网络不可达、端口被占用等错误。请描述如何在代码中合理地处理这些错误,并且给出一个简单示例代码片段,展示如何捕获和处理连接失败的错误。
37.4万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试

在Rust中,TcpStream::connect方法返回一个Result<TcpStream, std::io::Error>。我们可以通过match语句或者?操作符来处理错误。

  1. 使用match语句处理错误
use std::net::TcpStream;

fn main() {
    let result = TcpStream::connect("127.0.0.1:8080");
    match result {
        Ok(stream) => {
            println!("成功连接到服务器");
            // 在这里进行后续的读写操作
        }
        Err(e) => {
            if e.kind() == std::io::ErrorKind::AddrNotAvailable {
                println!("网络不可达");
            } else if e.kind() == std::io::ErrorKind::AddrInUse {
                println!("端口被占用");
            } else {
                println!("其他错误: {:?}", e);
            }
        }
    }
}
  1. 使用?操作符处理错误
use std::net::TcpStream;
use std::io::{self, ErrorKind};

fn connect_to_server() -> Result<(), io::Error> {
    let stream = TcpStream::connect("127.0.0.1:8080")?;
    println!("成功连接到服务器");
    // 在这里进行后续的读写操作
    Ok(())
}

fn main() {
    match connect_to_server() {
        Ok(()) => (),
        Err(e) => {
            if e.kind() == ErrorKind::AddrNotAvailable {
                println!("网络不可达");
            } else if e.kind() == ErrorKind::AddrInUse {
                println!("端口被占用");
            } else {
                println!("其他错误: {:?}", e);
            }
        }
    }
}

在上述示例中,match语句和?操作符都可以用来处理TcpStream::connect可能返回的错误。match语句提供了一种更详细的方式来处理不同类型的错误,而?操作符则更加简洁,适用于将错误返回给调用者的情况。同时,通过io::ErrorKind可以判断具体的错误类型,如网络不可达(AddrNotAvailable)、端口被占用(AddrInUse)等。