From 237bcead7a923e048e4cc27e04d68dc60af69fb0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dawid=20Ci=C4=99=C5=BCarkiewicz?= Date: Tue, 1 Nov 2016 22:44:25 -0700 Subject: Add UDP echo server example. --- examples/echo-udp.rs | 75 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 examples/echo-udp.rs (limited to 'examples/echo-udp.rs') diff --git a/examples/echo-udp.rs b/examples/echo-udp.rs new file mode 100644 index 00000000..83aa995a --- /dev/null +++ b/examples/echo-udp.rs @@ -0,0 +1,75 @@ +//! An UDP echo server that just sends back everything that it receives. + +extern crate futures; +#[macro_use] +extern crate tokio_core; + +use std::{env, io}; +use std::net::SocketAddr; + +use futures::{Future, Poll}; +use tokio_core::net::UdpSocket; +use tokio_core::reactor::Core; + +/// UDP echo server +struct Server { + socket : UdpSocket, + buf : Vec, + to_send : Option<(usize, SocketAddr)>, +} + +impl Server { + fn new(s : UdpSocket) -> Self { + Server { + socket: s, + to_send: None, + buf: vec![0u8; 1600], + } + } +} + +impl Future for Server { + type Item = (); + type Error = io::Error; + + fn poll(&mut self) -> Poll<(), io::Error> { + loop { + if let Some((size, peer)) = self.to_send.take() { + match self.socket.send_to(&self.buf[..size], &peer) { + Err(e) => { + self.to_send = Some((size, peer)); + return try_nb!(Err(e)); + }, + Ok(_) => { + println!("Echoed {} bytes", size); + } + } + } + + self.to_send = Some( + try_nb!(self.socket.recv_from(&mut self.buf)) + ); + } + } +} + +fn main() { + let addr = env::args().nth(1).unwrap_or("127.0.0.1:8080".to_string()); + let addr = addr.parse::().unwrap(); + + // Create the event loop that will drive this server + let mut l = Core::new().unwrap(); + let handle = l.handle(); + + // Create and bind an UDP socket + let socket = UdpSocket::bind(&addr, &handle).unwrap(); + + // Inform that we have are listening + println!("Listening on: {}", addr); + + // Create a server future + let server = Server::new(socket); + + // Start event loop with the initial future: UDP echo server + l.run(server).unwrap(); +} -- cgit v1.2.3