#bindings #don't #byte #future #c-library #protocols #picoquic

sys picoquic-sys

提供对 picoquic C 库的绑定。请勿直接使用此 crate。使用 picoquic crate。

1 个不稳定版本

使用旧的 Rust 2015

0.1.0 2018年2月2日

#97 in #don't


用于 picoquic

MIT/Apache

4MB
72K SLoC

Bitbake 37K SLoC // 0.0% comments C 29K SLoC // 0.1% comments GNU Style Assembly 2.5K SLoC // 0.0% comments Python 1.5K SLoC // 0.2% comments Visual Studio Project 1.5K SLoC C++ 272 SLoC // 0.1% comments Visual Studio Solution 162 SLoC Arduino C++ 67 SLoC // 0.1% comments Rust 47 SLoC // 0.0% comments Perl 33 SLoC Forge Config 12 SLoC

包含(ZIP 文件,17MB) src/picoquic/Report20171222-1702.vspx

Picoquic-rs - picoquic 的 Tokio 兼容绑定

Build Status

Picoquic 是 IETF 提出的 QUIC 协议的最小化实现。该协议仍在开发中,因此实现也在不断变化。

构建

没有

  • 没有
  • 没有
git submodule init
git submodule update

没有

没有

没有

extern crate bytes;
extern crate futures;
extern crate picoquic;
extern crate tokio;

use picoquic::{Config, Context};

use bytes::Bytes;

use futures::{Future, Sink, Stream};

fn main() {
    let mut evt_loop = tokio::runtime::Runtime::new().unwrap();

    let manifest_dir = env!("CARGO_MANIFEST_DIR");

    let mut config = Config::new();
    config.set_root_certificate_filename(format!("{}/examples/ca_cert.pem", manifest_dir));

    let mut client = Context::new(&([0, 0, 0, 0], 0).into(), evt_loop.executor(), config).unwrap();

    let mut con = evt_loop
        .block_on(client.new_connection(([127, 0, 0, 1], 22222).into(), "server.test"))
        .unwrap();

    let stream = evt_loop.block_on(con.new_bidirectional_stream()).unwrap();

    let stream = evt_loop
        .block_on(stream.send(Bytes::from("hello server")))
        .unwrap();

    let answer = evt_loop
        .block_on(
            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;

use picoquic::{Config, Context};

use futures::{Future, Sink, Stream};

use bytes::Bytes;

fn main() {
    let evt_loop = tokio::runtime::Runtime::new().unwrap();

    let manifest_dir = env!("CARGO_MANIFEST_DIR");

    let mut config = Config::new();
    config.set_certificate_chain_filename(format!("{}/examples/cert.pem", manifest_dir));
    config.set_private_key_filename(format!("{}/examples/key.pem", manifest_dir));

    let server = Context::new(&([0, 0, 0, 0], 22222).into(), evt_loop.executor(), config).unwrap();

    println!("Server listening on: {}", server.local_addr());

    evt_loop.block_on_all(
        server
            .for_each(|c| {
                println!("New connection from: {}", c.peer_addr());

                tokio::spawn(
                    c.for_each(move |s| {
                        // 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 too early.
                        tokio::spawn(
                            s.into_future()
                                .map_err(|_| ())
                                .and_then(|(m, s)| {
                                    println!("Got: {:?}", m);
                                    s.send(Bytes::from("hello client")).map_err(|_| ())
                                })
                                .and_then(|s| s.collect().map_err(|_| ()))
                                .map(|_| ()),
                        );
                        Ok(())
                    })
                    .map_err(|_| ()),
                );

                Ok(())
            })
    ).unwrap();
}

没有

  • 没有
  • 没有
  • 没有
  • 没有

没有

没有

  • 没有
  • 没有

没有

没有

没有

没有

没有