stdnet_test/
main.rs

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}