1#![allow(unreachable_code, dead_code, unused_imports)]
2
3use std::{
4 io::{Read, Write},
5 net::{SocketAddr, TcpListener, TcpStream, ToSocketAddrs},
6 time::Instant,
7};
8
9use async_executor::LocalExecutor;
10
11mod async_test {
12 use std::net::SocketAddr;
13
14 use async_net::TcpStream;
15 use futures_lite::{AsyncReadExt, AsyncWriteExt};
16
17 pub async fn async_stdnet_connect_test(addr: SocketAddr) {
18 let mut sock = TcpStream::connect(addr).await.unwrap();
19
20 let req = format!(
21 "GET / HTTP/1.1\r\nHost: google.com\r\nUser-Agent: curl/7.1.0\r\nAccept: */*\r\n\r\n",
22 );
23 sock.write(req.as_bytes()).await.unwrap();
24 sock.shutdown(std::net::Shutdown::Write).unwrap();
25 let mut total = 0;
26 loop {
27 let mut buf = [0; 4096];
28 let count = sock.read(&mut buf).await.unwrap();
29 if total == 0 {
30 let s = str::from_utf8(&buf[0..count.min(256)]);
31 println!("{} bytes: {:?}", count, s);
32 }
33 total += count;
34 if count == 0 || total == 104857600 {
35 break;
36 }
37 }
38 }
39}
40
41fn main() {
42 {
43 println!("doing async connect test");
44 let lookup = "google.com:80".to_socket_addrs().unwrap();
45 let first = lookup.into_iter().next();
46 println!("got {:?}", first);
47 let first = first.unwrap();
48 let exec = LocalExecutor::new();
49 async_io::block_on(exec.run(async { async_test::async_stdnet_connect_test(first).await }));
50 return;
51 }
52
53 {
54 let lookup = "ash-speed.hetzner.com:80".to_socket_addrs().unwrap();
55 let first = lookup.into_iter().next();
56 println!("got {:?}", first);
57 let first = first.unwrap();
58 const BIG_FILE: &str = "/100MB.bin";
59 let mut sock = TcpStream::connect(first).unwrap();
60 let req = format!(
61 "GET {} HTTP/1.1\r\nHost: ash-speed.hetzner.com\r\nUser-Agent: curl/7.1.0\r\nAccept: */*\r\n\r\n",
62 BIG_FILE
63 );
64 sock.write(req.as_bytes()).unwrap();
65
66 let mut total = 0;
67 let start = Instant::now();
68 loop {
69 let mut buf = [0; 4096];
70 let count = sock.read(&mut buf).unwrap();
71 if total == 0 {
72 let s = str::from_utf8(&buf[0..count.min(256)]);
73 println!("{} bytes: {:?}", count, s);
74 } else {
75 let speed = (total as f64 / start.elapsed().as_millis() as f64) * 1000.0;
76 println!(
77 "{} bytes ({} / {}): {:.2}KB/s",
78 count,
79 total,
80 104857600,
81 speed / 1024.0
82 );
83 }
84 total += count;
85 if count == 0 || total == 104857600 {
86 break;
87 }
88 }
89 sock.shutdown(std::net::Shutdown::Write).unwrap();
90
91 println!("read {} bytes total ({}MB)", total, total / (1024 * 1024));
92 }
93
94 let listener = TcpListener::bind("0.0.0.0:5555").expect("bind failed");
95 println!("Listening on 0.0.0.0:5555. Waiting for a client...");
96
97 for stream in listener.incoming() {
98 match stream {
99 Ok(mut stream) => {
100 println!("Client connected: {:?}", stream.peer_addr());
101 let mut buf = [0u8; 512];
102 loop {
103 let n = match stream.read(&mut buf) {
104 Ok(0) => {
105 println!("Client disconnected.");
106 break;
107 }
108 Ok(n) => n,
109 Err(e) => {
110 eprintln!("Read error: {}", e);
111 break;
112 }
113 };
114 stream.write_all(&buf[..n]).expect("write failed");
115 }
116 }
117 Err(e) => {
118 std::thread::sleep(std::time::Duration::from_secs(1));
119 eprintln!("Bind failed with error: {:?}", e);
120 eprintln!("Error kind: {:?}", e.kind());
121 eprintln!("Error message: {}", e);
122 }
123 }
124 }
125}