From fe2040706b9be0b26a6747e12a9515786211a19c Mon Sep 17 00:00:00 2001 From: _ <> Date: Sat, 17 Jul 2021 01:10:30 +0000 Subject: [PATCH] add QUIC client --- .../quic_demo/src/bin/quic_demo_client.rs | 35 +++++++++++++++++++ .../quic_demo/src/bin/quic_demo_end_server.rs | 2 +- prototypes/quic_demo/src/prelude.rs | 4 +++ prototypes/quic_demo/src/quinn_utils.rs | 5 ++- 4 files changed, 44 insertions(+), 2 deletions(-) create mode 100644 prototypes/quic_demo/src/bin/quic_demo_client.rs diff --git a/prototypes/quic_demo/src/bin/quic_demo_client.rs b/prototypes/quic_demo/src/bin/quic_demo_client.rs new file mode 100644 index 0000000..86fa115 --- /dev/null +++ b/prototypes/quic_demo/src/bin/quic_demo_client.rs @@ -0,0 +1,35 @@ +use quic_demo::prelude::*; + +#[tokio::main] +async fn main () -> anyhow::Result <()> { + tracing_subscriber::fmt::init (); + + let server_cert = tokio::fs::read ("quic_server.crt").await?; + let server_addr = "127.0.0.1:30380".parse ()?; + let endpoint = make_client_endpoint ("0.0.0.0:0".parse ()?, &[&server_cert])?; + + debug! ("Connecting to relay server"); + + let quinn::NewConnection { + connection, + .. + } = endpoint.connect (&server_addr, "localhost")?.await?; + + debug! ("Connecting to end server"); + + let (mut send, mut recv) = connection.open_bi ().await?; + + let mut buf = vec! [0u8; 65_536]; + let mut send_interval = tokio::time::interval (Duration::from_millis (1000)); + // send_interval.set_missed_tick_behavior (tokio::time::MissedTickBehavior::Skip); + loop { + send_interval.tick ().await; + + send.write_all (b"Hi!\n").await?; + let bytes_read = recv.read (&mut buf).await?.ok_or_else (|| anyhow::anyhow! ("Server or relay closed connection"))?; + let buf_slice = &buf [0..bytes_read]; + + let s = std::str::from_utf8 (buf_slice)?; + println! ("Received: `{}`", s); + } +} diff --git a/prototypes/quic_demo/src/bin/quic_demo_end_server.rs b/prototypes/quic_demo/src/bin/quic_demo_end_server.rs index dcfc6df..61ff175 100644 --- a/prototypes/quic_demo/src/bin/quic_demo_end_server.rs +++ b/prototypes/quic_demo/src/bin/quic_demo_end_server.rs @@ -21,7 +21,7 @@ async fn main () -> anyhow::Result <()> { let mut buf = vec! [0u8; 65_536]; while let Some (bytes_read) = recv.read (&mut buf).await? { - let s = format! ("bytes_read: {}\n", bytes_read); + let s = format! ("bytes_read: {}", bytes_read); send.write_all (s.as_bytes ()).await?; } diff --git a/prototypes/quic_demo/src/prelude.rs b/prototypes/quic_demo/src/prelude.rs index 2ab0c75..4aece1b 100644 --- a/prototypes/quic_demo/src/prelude.rs +++ b/prototypes/quic_demo/src/prelude.rs @@ -1,3 +1,7 @@ +pub use std::{ + time::Duration, +}; + pub use futures_util::StreamExt; pub use tracing::{ debug, diff --git a/prototypes/quic_demo/src/quinn_utils.rs b/prototypes/quic_demo/src/quinn_utils.rs index 2a34319..08486f1 100644 --- a/prototypes/quic_demo/src/quinn_utils.rs +++ b/prototypes/quic_demo/src/quinn_utils.rs @@ -5,7 +5,10 @@ use quinn::{ Certificate, CertificateChain, ClientConfig, ClientConfigBuilder, Endpoint, Incoming, PrivateKey, ServerConfig, ServerConfigBuilder, TransportConfig, }; -use std::{error::Error, net::SocketAddr, sync::Arc}; +use std::{ + net::SocketAddr, + sync::Arc, +}; /// Constructs a QUIC endpoint configured for use a client only. ///