gpt4 book ai didi

rust - 如何使用 Tokio 从 TcpStream 读取单个数据包?

转载 作者:行者123 更新时间:2023-11-29 08:29:33 25 4
gpt4 key购买 nike

我正在尝试使用 tokio 接收单个数据包:

extern crate tokio;
extern crate tokio_io;

use tokio::net::{TcpListener};
use tokio::prelude::*;

use std::net::SocketAddr;
fn main() {
let addr = "0.0.0.0:8080".parse::<SocketAddr>().unwrap();
let socket = TcpListener::bind(&addr).unwrap();
println!("Listening on: {}", addr);

let done = socket
.incoming()
.map_err(|e| println!("failed to accept socket; error = {:?}", e))
.for_each(move |mut socket| {
let mut bytes = vec![];
bytes.reserve(1024);
let processor = socket.read_buf(&mut bytes).into_future()
.and_then(move |_size| {
println!("bytes: {:?}", bytes);
Ok(())
})
.map_err(|_| ());;
tokio::spawn(processor)
});
tokio::run(done);
}

此代码打印一个空数据包。我如何更改此代码以打印接收到的包含数据的数据包?

最佳答案

对于我自己,我几乎找到了答案。很有帮助Similar question .

struct AsWeGetIt<R>(R);

impl<R> Stream for AsWeGetIt<R>
where
R: AsyncRead,
{
type Item = BytesMut;
type Error = std::io::Error;

fn poll(&mut self) -> Poll<Option<Self::Item>, Self::Error> {
let mut buf = BytesMut::with_capacity(1000);

self.0
.read_buf(&mut buf)
.map(|async| async.map(|_| Some(buf)))
}
}
....
let processor = AsWeGetIt(socket).into_future()
.and_then(|(bytes,_)| {
println!("bytes: {:?}", bytes);
Ok(())
}).map_err(|_| ());

但是为了更好地理解如何在没有单独结构的情况下做...为什么以及 map 使用什么?

关于rust - 如何使用 Tokio 从 TcpStream 读取单个数据包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50825350/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com