summaryrefslogtreecommitdiffstats
path: root/examples/echo-udp.rs
diff options
context:
space:
mode:
authorDawid Ciężarkiewicz <dpc@dpc.pw>2016-11-01 22:44:25 -0700
committerDawid Ciężarkiewicz <dpc@dpc.pw>2016-11-02 16:30:37 -0700
commit237bcead7a923e048e4cc27e04d68dc60af69fb0 (patch)
tree462244d6107e79f7241cda340dbf86f621b131bd /examples/echo-udp.rs
parent623ce443d89cd9ffa2c1adae8d2eb75538802d01 (diff)
Add UDP echo server example.
Diffstat (limited to 'examples/echo-udp.rs')
-rw-r--r--examples/echo-udp.rs75
1 files changed, 75 insertions, 0 deletions
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<u8>,
+ 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::<SocketAddr>().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();
+}