Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- extern crate tokio;
- use std::io;
- use std::ops::Range;
- use tokio::io::{TryRead, TryWrite};
- use tokio::server::listen;
- use tokio::tcp::TcpStream;
- use tokio::reactor::{Reactor, Task, Tick};
- struct Echo {
- buf: Vec<u8>,
- pending: Range<usize>,
- stream: TcpStream,
- }
- impl Echo {
- fn from_stream(stream: TcpStream) -> io::Result<Echo> {
- Ok(Echo {
- buf: vec![0; 128],
- pending: 0..0,
- stream: stream,
- })
- }
- }
- impl Task for Echo {
- fn tick(&mut self) -> io::Result<Tick> {
- loop {
- match self.pending {
- Range { start, end } if start == end => {
- if let Some(len) = try!(self.stream
- .try_read(&mut self.buf)) {
- self.pending = 0..len;
- } else {
- return Ok(Tick::WouldBlock);
- }
- }
- ref mut range => {
- if let Some(len) = try!(self.stream
- .try_write(&self.buf[range.clone()])) {
- range.start += len;
- } else {
- return Ok(Tick::WouldBlock);
- }
- }
- }
- }
- }
- }
- fn main() {
- let reactor = Reactor::default().unwrap();
- let address = "0.0.0.0:7000".parse().unwrap();
- listen(&reactor.handle(), address, Echo::from_stream).unwrap();
- reactor.run().unwrap();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement