14个版本
使用旧的Rust 2015
0.2.13 | 2017年11月8日 |
---|---|
0.2.12 | 2017年8月27日 |
0.2.11 | 2017年3月17日 |
0.2.9 | 2017年2月22日 |
0.2.5 | 2016年12月18日 |
#832 在 异步
99 每月下载量
在 4 个crate(3个直接)中使用
180KB
4K SLoC
handy_async
此库提供了一些功能,帮助Rust中的异步操作。
handy_async
使用 futures 来实现异步操作(主要是I/O相关操作)并定义了许多模式对象,以方便编写声明式代码。
例如,您可以编写一个异步读取在 RFC-793 中定义的TCP头部的函数,如下所示。
extern crate handy_async;
extern crate futures;
use std::io::{Read, Error};
use futures::{Future, BoxFuture};
use handy_async::io::ReadFrom;
use handy_async::pattern::{Pattern, Endian};
use handy_async::pattern::read::{U16, U32};
struct TcpHeader {
source_port: u16,
destination_port: u16,
sequence_number: u32,
acknowledgment_number: u32,
data_offset: u8, // 4 bits
reserved: u8, // 6 bits
flags: u8, // 6 bits
window: u16,
checksum: u16,
urgent_pointer: u16,
option: Vec<u8>,
}
fn read_tcp_header<R: Read + Send + 'static>(reader: R) -> BoxFuture<TcpHeader, Error> {
let pattern = (U16.be(), U16.be(), U32.be(), U32.be(),
U16.be(), U16.be(), U16.be(), U16.be())
.and_then(|(src_port, dst_port, seq_num, ack_num, flags, window, checksum, urgent)| {
let data_offset = (flags & 0b1111) as u8;
let header = TcpHeader {
source_port: src_port,
destination_port: dst_port,
sequence_number: seq_num,
acknowledgment_number: ack_num,
data_offset: data_offset,
reserved: ((flags >> 4) & 0b111111) as u8,
flags: (flags >> 10) as u8,
window: window,
checksum: checksum,
urgent_pointer: urgent,
option: Vec::new(),
};
let option_size = (data_offset as usize - 5) * 4;
(Ok(header), vec![0; option_size]) // Reads additional option bytes
})
.map(|(mut header, option)| {
header.option = option;
header
});
pattern.read_from(reader).map(|(reader, header)| header).map_err(|e| e.into_error()).boxed()
}
安装
将以下行添加到您的 Cargo.toml
[dependencies]
handy_async = "0.2"
依赖关系
~175KB