Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #![feature(async_await)]
- use tokio::{prelude::*, net::TcpListener};
- #[tokio::main]
- #[allow(non_upper_case_globals, deprecated)]
- async fn main() -> Result<(), Box<dyn std::error::Error>> {
- let addr = "0.0.0.0:12345".parse()?;
- let mut listener = TcpListener::bind(&addr).unwrap();
- const num_responses: usize = 64 * 1024;
- const response: &[u8] = b"HTTP/1.1 200 Ok\r\nContent-Length: 11\r\n\r\nHello World";
- let mut data = Vec::with_capacity(num_responses * response.len());
- for _ in 0..num_responses {
- data.extend_from_slice(response);
- }
- loop {
- let (mut socket, _) = listener.accept().await?;
- let data_ptr = data.as_mut_ptr() as usize;
- socket.set_nodelay(true)?;
- tokio::spawn(async move {
- let mut buf = [unsafe { std::mem::uninitialized() }; 64 * 1024];
- let data = unsafe { std::slice::from_raw_parts(data_ptr as *mut u8, num_responses * response.len()) };
- loop {
- match socket.read(&mut buf).await {
- Ok(0) | Err(_) => return,
- Ok(_) => if socket.write_all(&data).await.is_err() { return }
- }
- }
- });
- }
- }
Add Comment
Please, Sign In to add comment