From 2cd0ea9a2e2691c6cdb3520e548beb938d959e8c Mon Sep 17 00:00:00 2001 From: Anton Patrushev Date: Wed, 20 Feb 2019 22:21:59 +0500 Subject: [PATCH 1/2] udp echo server example --- Cargo.toml | 1 + udp-echo/Cargo.toml | 11 +++++++++++ udp-echo/README.md | 18 +++++++++++++++++ udp-echo/src/main.rs | 47 ++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 77 insertions(+) create mode 100644 udp-echo/Cargo.toml create mode 100644 udp-echo/README.md create mode 100644 udp-echo/src/main.rs diff --git a/Cargo.toml b/Cargo.toml index ae0b605e..12aa5a71 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -30,6 +30,7 @@ members = [ "tls", "rustls", "unix-socket", + "udp-echo", "web-cors/backend", "websocket", "websocket-chat", diff --git a/udp-echo/Cargo.toml b/udp-echo/Cargo.toml new file mode 100644 index 00000000..8174deab --- /dev/null +++ b/udp-echo/Cargo.toml @@ -0,0 +1,11 @@ +[package] +name = "udp-echo" +version = "0.1.0" +authors = ["Anton Patrushev "] +edition = "2018" + +[dependencies] +actix = "0.7" +tokio = "*" +futures = "*" +bytes = "*" diff --git a/udp-echo/README.md b/udp-echo/README.md new file mode 100644 index 00000000..a72dd5da --- /dev/null +++ b/udp-echo/README.md @@ -0,0 +1,18 @@ +# udp-echo + +## Usage + +### server + +```bash +cd examples/udp-echo +cargo run +# Started http server: 127.0.0.1:12345 +``` + +### socat client +Copy port provided in server output and run following command to communicate +with the udp server: +```bash +socat - UDP4:localhost:12345 +``` diff --git a/udp-echo/src/main.rs b/udp-echo/src/main.rs new file mode 100644 index 00000000..c3406a5d --- /dev/null +++ b/udp-echo/src/main.rs @@ -0,0 +1,47 @@ +extern crate actix; +extern crate bytes; +extern crate futures; +extern crate tokio; + +use actix::{Actor, AsyncContext, Context, Message, StreamHandler}; +use bytes::BytesMut; +use futures::stream::SplitSink; +use futures::{Future, Sink, Stream}; +use std::net::SocketAddr; +use tokio::codec::BytesCodec; +use tokio::net::{UdpFramed, UdpSocket}; + +struct UdpActor { + sink: SplitSink>, +} +impl Actor for UdpActor { + type Context = Context; +} + +#[derive(Message)] +struct UdpPacket(BytesMut, SocketAddr); +impl StreamHandler for UdpActor { + fn handle(&mut self, msg: UdpPacket, _: &mut Context) { + println!("Received: ({:?}, {:?})", msg.0, msg.1); + (&mut self.sink).send((msg.0.into(), msg.1)).wait().unwrap(); + } +} + +fn main() { + let sys = actix::System::new("echo-udp"); + + let addr: SocketAddr = "127.0.0.1:0".parse().unwrap(); + let sock = UdpSocket::bind(&addr).unwrap(); + println!( + "Started udp server on: 127.0.0.1:{:?}", + sock.local_addr().unwrap().port() + ); + + let (sink, stream) = UdpFramed::new(sock, BytesCodec::new()).split(); + UdpActor::create(|ctx| { + ctx.add_stream(stream.map(|(data, sender)| UdpPacket(data, sender))); + UdpActor { sink: sink } + }); + + std::process::exit(sys.run()); +} From 0d45081fa09f6640511ced75651c47a2858953f0 Mon Sep 17 00:00:00 2001 From: Anton Patrushev Date: Fri, 22 Feb 2019 15:00:58 +0500 Subject: [PATCH 2/2] code review fixes --- .travis.yml | 1 + Cargo.toml | 2 +- udp-echo/Cargo.toml | 6 +++--- udp-echo/src/main.rs | 5 ----- 4 files changed, 5 insertions(+), 9 deletions(-) diff --git a/.travis.yml b/.travis.yml index 66f91d8b..24111b9d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -62,6 +62,7 @@ script: cd template_tera && cargo check && cd .. cd tls && cargo check && cd .. cd rustls && cargo check && cd .. + cd udp-echo && cargo check && cd .. cd unix-socket && cargo check && cd .. cd web-cors/backend && cargo check && cd ../.. cd websocket && cargo check && cd .. diff --git a/Cargo.toml b/Cargo.toml index 12aa5a71..6a9b3e27 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -29,8 +29,8 @@ members = [ "template_tera", "tls", "rustls", - "unix-socket", "udp-echo", + "unix-socket", "web-cors/backend", "websocket", "websocket-chat", diff --git a/udp-echo/Cargo.toml b/udp-echo/Cargo.toml index 8174deab..37da872e 100644 --- a/udp-echo/Cargo.toml +++ b/udp-echo/Cargo.toml @@ -6,6 +6,6 @@ edition = "2018" [dependencies] actix = "0.7" -tokio = "*" -futures = "*" -bytes = "*" +tokio = "0.1" +futures = "0.1" +bytes = "0.4" diff --git a/udp-echo/src/main.rs b/udp-echo/src/main.rs index c3406a5d..b926020b 100644 --- a/udp-echo/src/main.rs +++ b/udp-echo/src/main.rs @@ -1,8 +1,3 @@ -extern crate actix; -extern crate bytes; -extern crate futures; -extern crate tokio; - use actix::{Actor, AsyncContext, Context, Message, StreamHandler}; use bytes::BytesMut; use futures::stream::SplitSink;