我需要从使用https://github.com/yaa110/async-tun设置的TUN设备中读取特定数量的字节。
我还需要控制对可以被另一个未来修改的hashmap的访问。
use futures::StreamExt;
const MTU_SIZE: usize = 1500;
let tun: Tun = match TunBuilder::new()
.name("")
.tap(false)
.packet_info(false)
.up()
.mtu(MTU_SIZE as i32)
.try_build()
.await
{
Ok(tun) => tun,
Err(e) => panic!("couldn't create tun device: {e:?}"),
};
use async_std::io::{BufReader, File};
let mut tun_reader: BufReader<&File> = tun.reader();
loop {
select! {
p = tun_reader.select_next_some() => { // read from hashmap }
e = ... => { // possibly add entries to hashmap }
}
}这不起作用,因为BufReader<&File>没有实现Stream。大多数示例使用.lines().fuse()来创建与select一起工作的东西,但是我不需要行;我只需要一个[u8; MTU_SIZE]。
很明显,我对生锈处理期货的态度太过激了,所以我要指出这个领域的介绍性资源是完全可以的。
在午睡和下面@cdhowie的一些建议之后,我认为我的循环应该类似于
loop {
let mut packet: Packet = [0u8; 1500];
let read_task = tun_reader.read_exact(&mut packet).fuse();
pin_mut!(read_task);
select!{
p = read_task => { // read from hashmap }
e = ... => { // possibly add entries to hashmap }
}
}发布于 2022-06-08 20:03:15
如果您已经导入了async_std::io::prelude::*,那么您将可以访问ReadExt,它具有从异步Read值(如BufReader )获取期货的方法。在这种情况下,您可能需要tun_reader.read_exact(),将它传递给一个可变的[u8; MTU_SIZE]。
https://stackoverflow.com/questions/72550147
复制相似问题