Guest User

rust tokio

a guest
Aug 24th, 2019
162
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Rust 1.21 KB | None | 0 0
  1. #![feature(async_await)]
  2. use tokio::{prelude::*, net::TcpListener};
  3.  
  4. #[tokio::main]
  5. #[allow(non_upper_case_globals, deprecated)]
  6. async fn main() -> Result<(), Box<dyn std::error::Error>> {
  7.     let addr = "0.0.0.0:12345".parse()?;
  8.     let mut listener = TcpListener::bind(&addr).unwrap();
  9.  
  10.     const num_responses: usize = 64 * 1024;
  11.     const response: &[u8] = b"HTTP/1.1 200 Ok\r\nContent-Length: 11\r\n\r\nHello World";
  12.     let mut data = Vec::with_capacity(num_responses * response.len());
  13.     for _ in 0..num_responses {
  14.         data.extend_from_slice(response);
  15.     }
  16.  
  17.     loop {
  18.         let (mut socket, _) = listener.accept().await?;
  19.         let data_ptr = data.as_mut_ptr() as usize;
  20.         socket.set_nodelay(true)?;
  21.  
  22.         tokio::spawn(async move {
  23.             let mut buf = [unsafe { std::mem::uninitialized() }; 64 * 1024];
  24.             let data = unsafe { std::slice::from_raw_parts(data_ptr as *mut u8, num_responses * response.len()) };
  25.             loop {
  26.                 match socket.read(&mut buf).await {
  27.                     Ok(0) | Err(_) => return,
  28.                     Ok(_) => if socket.write_all(&data).await.is_err() { return }
  29.                 }
  30.             }
  31.         });
  32.     }
  33. }
Add Comment
Please, Sign In to add comment