这是我的代码:

use std::net;
use std::thread;

fn scan_port(host: &str, port: u16) -> bool {
    let host = host.to_string();
    let port = port;
    let t = thread::spawn(move || net::TcpStream::connect((host.as_str(), port)).is_ok());

    t.join().unwrap()
}

如果连接没有在N秒内完成,我如何创建一个线程将被终止或终止的情况?

原因是Rust无法设置套接字连接超时,所以我无法确保程序不会被卡住.

推荐答案

@ker的回答将始终等待5秒,即使连接完成得更快.下面是一种类似的方法,超时和网络请求both发生在不同的线程上,第一个完成的线程获胜:

let (sender, receiver) = mpsc::channel();
let tsender = sender.clone();
let t = thread::spawn(move || {
    match sender.send(Ok(net::TcpStream::connect((host.as_str(), port)))) {
        Ok(()) => {}, // everything good
        Err(_) => {}, // we have been released, don't panic
    }
});
let timer = thread::spawn(move || {
  thread::sleep(Duration::from_millis(5000));
  match tsender.send(Err(MyTimeoutError)) {
    Ok(()) => {}, // oops, we timed out
    Err(_) => {}, // great, the request finished already
  }
});
return receiver.recv().unwrap();

但只要你这么做,你最好还是用recv_timeout来代替:

let (sender, receiver) = mpsc::channel();
let t = thread::spawn(move || {
    match sender.send(net::TcpStream::connect((host.as_str(), port))) {
        Ok(()) => {}, // everything good
        Err(_) => {}, // we have been released, don't panic
    }
});
return receiver.recv_timeout(Duration::from_millis(5000));

Rust相关问答推荐

为什么父作用域中的变量超出了子作用域

如何在tauri—leptos应用程序中监听后端值的变化?""

收集RangeInclusive T到Vec T<><>

trait声明中的生命周期参数

在Rust中有没有办法在没有UB的情况下在指针和U64之间进行转换?

如何为rust trait边界指定多种可能性

RUST应用程序正在退出,错误代码为:(退出代码:0xc0000005,STATUS_ACCESS_VIOLATION)

铁 rust ,我的模块介绍突然遇到了一个问题

通过RabbitMQ取消铁 rust 中长时间运行的人造丝任务的策略

为什么`str`类型可以是任意大小(未知大小),而`string`类型的大小应该是已知的?

borrow 是由于对 `std::sync::Mutex>` 的解引用强制而发生的

如何在 Rust 中打印 let-else 语句中的错误?

为什么这个闭包没有实现Fn?

从 HashMap>, _> 中删除的生命周期问题

使用 `clap` 在 Rust CLI 工具中设置布尔标志

将文件的第一行分别读取到文件的其余部分的最有效方法是什么?

提取 struct 生成宏中字段出现的索引

在 Rust 中有条件地导入?

基于名称是否存在的条件编译

为什么 Rust 中的关联类型需要明确的生命周期注释?