首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在async_std::io::BufReader中使用select?

如何在async_std::io::BufReader中使用select?
EN

Stack Overflow用户
提问于 2022-06-08 17:48:59
回答 1查看 92关注 0票数 0

我需要从使用https://github.com/yaa110/async-tun设置的TUN设备中读取特定数量的字节。

我还需要控制对可以被另一个未来修改的hashmap的访问。

代码语言:javascript
复制
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的一些建议之后,我认为我的循环应该类似于

代码语言:javascript
复制
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 }
    }
}
EN

回答 1

Stack Overflow用户

发布于 2022-06-08 20:03:15

如果您已经导入了async_std::io::prelude::*,那么您将可以访问ReadExt,它具有从异步Read值(如BufReader )获取期货的方法。在这种情况下,您可能需要tun_reader.read_exact(),将它传递给一个可变的[u8; MTU_SIZE]

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72550147

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档