Advertisement
Guest User

Untitled

a guest
Aug 24th, 2016
56
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.45 KB | None | 0 0
  1. extern crate tokio;
  2.  
  3. use std::io;
  4. use std::ops::Range;
  5.  
  6. use tokio::io::{TryRead, TryWrite};
  7. use tokio::server::listen;
  8. use tokio::tcp::TcpStream;
  9. use tokio::reactor::{Reactor, Task, Tick};
  10.  
  11. struct Echo {
  12. buf: Vec<u8>,
  13. pending: Range<usize>,
  14. stream: TcpStream,
  15. }
  16.  
  17. impl Echo {
  18. fn from_stream(stream: TcpStream) -> io::Result<Echo> {
  19. Ok(Echo {
  20. buf: vec![0; 128],
  21. pending: 0..0,
  22. stream: stream,
  23. })
  24. }
  25. }
  26.  
  27. impl Task for Echo {
  28. fn tick(&mut self) -> io::Result<Tick> {
  29. loop {
  30. match self.pending {
  31. Range { start, end } if start == end => {
  32. if let Some(len) = try!(self.stream
  33. .try_read(&mut self.buf)) {
  34. self.pending = 0..len;
  35. } else {
  36. return Ok(Tick::WouldBlock);
  37. }
  38. }
  39. ref mut range => {
  40. if let Some(len) = try!(self.stream
  41. .try_write(&self.buf[range.clone()])) {
  42. range.start += len;
  43. } else {
  44. return Ok(Tick::WouldBlock);
  45. }
  46. }
  47. }
  48. }
  49. }
  50. }
  51.  
  52. fn main() {
  53. let reactor = Reactor::default().unwrap();
  54. let address = "0.0.0.0:7000".parse().unwrap();
  55. listen(&reactor.handle(), address, Echo::from_stream).unwrap();
  56. reactor.run().unwrap();
  57. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement