这是我的代码:
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没有办法设置套接字连接超时,所以我没有办法确保程序不会卡住。
3条答案
按热度按时间qlckcl4x1#
正如@Shepmaster所指出的:终止线程不是一个好主意。
您可以改为给予线程一个
Sender
,如果它成功地打开了一个连接,它应该通过它通知您(甚至可以通过发送句柄)。然后您可以让主线程sleep
等待您希望的时间。当您的线程唤醒时,它检查其对应的Receiver
以寻找来自该线程的某种生命迹象。只有release it into the wild by dropping theJoinHandle
和Receiver
。它不会消耗cpu时间(它被阻塞了),也不会消耗太多内存。如果它解除阻塞,它会检测到Sender
没有连接,并会永久关闭。当然,您不应该有大量的这些打开的线程,因为它们仍然使用资源(内存和系统线程句柄),但在正常的系统上,这不是太大的问题。
示例:
dw1jzc5e2#
@ker的回答总是等待5秒,即使连接完成得更快。下面是一个类似的方法,超时和网络请求 * 都 * 发生在不同的线程上,第一个完成的线程获胜:
但是,只要您这样做,就可以直接使用
recv_timeout
:5lwkijsr3#
这是一个抽象,因此您可以运行任何具有超时的函数