2 个版本
使用旧的 Rust 2015
0.1.1 | 2018年2月2日 |
---|---|
0.1.0 | 2018年2月2日 |
#118 in #quic
4MB
73K SLoC
Picoquic-rs - picoquic 的 Tokio 兼容绑定
Picoquic 是 IETF QUIC 协议的最简实现。该协议仍在 开发中,因此实现也在开发中。
构建
为了构建 picoquic-rs,你需要以下依赖项
- clang
- openssl
- cmake
构建目前在 Linux 上进行了测试。要构建项目,你只需运行 cargo build
。 picoquic-sys
也将为你构建 picoquic
C 库(希望如此)。
示例
客户端
extern crate bytes;
extern crate futures;
extern crate picoquic;
extern crate tokio_core;
use picoquic::{Config, Context, SMessage};
use tokio_core::reactor::Core;
use bytes::Bytes;
use futures::{Future, Sink, Stream};
fn main() {
let mut evt_loop = Core::new().unwrap();
let config = Config::client();
let mut client = Context::new(&([0, 0, 0, 0], 0).into(), &evt_loop.handle(), config).unwrap();
let mut con = evt_loop
.run(client.new_connection(([127, 0, 0, 1], 22222).into()))
.unwrap();
let stream = evt_loop.run(con.new_bidirectional_stream()).unwrap();
let stream = evt_loop
.run(stream.send(SMessage::Data(Bytes::from("hello server"))))
.unwrap();
let answer = evt_loop
.run(
stream
.into_future()
.map(|(m, _)| m.unwrap())
.map_err(|(e, _)| e),
)
.unwrap();
println!("Got: {:?}", answer);
}
服务器
extern crate bytes;
extern crate futures;
extern crate picoquic;
extern crate tokio_core;
use picoquic::{CMessage, Config, Context, SMessage};
use tokio_core::reactor::Core;
use futures::{Future, Sink, Stream};
use bytes::Bytes;
fn main() {
let mut evt_loop = Core::new().unwrap();
let manifest_dir = env!("CARGO_MANIFEST_DIR");
let config = Config::server(
&format!("{}/examples/cert.pem", manifest_dir),
&format!("{}/examples/key.pem", manifest_dir),
);
let server = Context::new(&([0, 0, 0, 0], 22222).into(), &evt_loop.handle(), config).unwrap();
println!("Server listening on: {}", server.local_addr());
let handle = evt_loop.handle();
evt_loop
.run(server.for_each(|c| {
println!("New connection from: {}", c.peer_addr());
let handle = handle.clone();
handle.clone().spawn(c.for_each(move |s| {
// Let's see what we got
let s = match s {
CMessage::NewStream(s) => s,
_ => return Ok(()),
};
// We print the received message and sent a new one, after that we collect all
// remaining messages. The collect is a "hack" that prevents that the `Stream` is
// dropped to early.
handle.spawn(
s.into_future()
.map_err(|_| ())
.and_then(|(m, s)| {
println!("Got: {:?}", m);
s.send(SMessage::Data(Bytes::from("hello client")))
.map_err(|_| ())
})
.and_then(|s| s.collect().map_err(|_| ()))
.map(|_| ()),
);
Ok(())
}).map_err(|_| ()));
Ok(())
}))
.unwrap();
}
待办事项
- 我的第一个使用
failure
的 crate/project,我对当前的错误结构不满意 :( - 支持更多配置选项
- 我目前没有检查所有 c 函数的返回代码。
- 从源代码中删除 TODO
许可证
许可证下任选其一
- Apache 许可证版本 2.0 (LICENSE-APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT 许可证 (LICENSE-MIT 或 http://opensource.org/licenses/MIT)
任选其一。
贡献
除非你明确表示,否则任何有意提交以包含在您的工作中的贡献,根据 Apache-2.0 许可证的定义,应按上述方式双重许可,而不附加任何其他条款或条件。
许可证:MIT/Apache-2.0
依赖关系
~8–11MB
~191K SLoC