32 opts.optflag("h", "help", "help"); |
31 opts.optflag("h", "help", "help"); |
33 let matches = match opts.parse(&args[1..]) { |
32 let matches = match opts.parse(&args[1..]) { |
34 Ok(m) => m, |
33 Ok(m) => m, |
35 Err(e) => { |
34 Err(e) => { |
36 println!("{}\n{}", e, opts.short_usage("")); |
35 println!("{}\n{}", e, opts.short_usage("")); |
37 return; |
36 return Ok(()); |
38 } |
37 } |
39 }; |
38 }; |
40 if matches.opt_present("h") { |
39 if matches.opt_present("h") { |
41 println!("{}", opts.usage(PROGRAM_NAME)); |
40 println!("{}", opts.usage(PROGRAM_NAME)); |
42 return; |
41 return Ok(()); |
43 } |
42 } |
44 |
43 |
45 let port = matches |
44 let port = matches |
46 .opt_str("p") |
45 .opt_str("p") |
47 .and_then(|s| u16::from_str(&s).ok()) |
46 .and_then(|s| u16::from_str(&s).ok()) |
48 .unwrap_or(46631); |
47 .unwrap_or(46631); |
49 let address = format!("0.0.0.0:{}", port).parse().unwrap(); |
48 let address: SocketAddr = format!("0.0.0.0:{}", port).parse().unwrap(); |
50 |
49 |
51 let listener = TcpListener::bind(address).unwrap(); |
50 let server = tokio::net::TcpListener::bind(address).await.unwrap(); |
52 |
51 |
53 let mut poll = Poll::new().unwrap(); |
52 let mut hw_network = NetworkLayerBuilder::default().with_listener(server).build(); |
54 let mut hw_builder = NetworkLayerBuilder::default().with_listener(listener); |
|
55 |
53 |
56 #[cfg(feature = "tls-connections")] |
54 hw_network.run().await; |
57 { |
55 Ok(()) |
58 let address = format!("0.0.0.0:{}", port + 1).parse().unwrap(); |
|
59 hw_builder = hw_builder.with_secure_listener(TcpListener::bind(address).unwrap()); |
|
60 } |
|
61 |
|
62 let mut hw_network = hw_builder.build(&poll); |
|
63 hw_network.register(&poll).unwrap(); |
|
64 |
|
65 let mut events = Events::with_capacity(1024); |
|
66 |
|
67 let mut time = Instant::now(); |
|
68 |
|
69 loop { |
|
70 let timeout = if hw_network.has_pending_operations() { |
|
71 Some(Duration::from_millis(1)) |
|
72 } else { |
|
73 None |
|
74 }; |
|
75 |
|
76 poll.poll(&mut events, timeout).unwrap(); |
|
77 |
|
78 for event in events.iter() { |
|
79 if event.is_readable() { |
|
80 match event.token() { |
|
81 token @ (utils::SERVER_TOKEN | utils::SECURE_SERVER_TOKEN) => { |
|
82 match hw_network.accept_client(&poll, token) { |
|
83 Ok(()) => (), |
|
84 Err(e) => debug!("Error accepting client: {}", e), |
|
85 } |
|
86 } |
|
87 #[cfg(feature = "official-server")] |
|
88 utils::IO_TOKEN => match hw_network.handle_io_result(&poll) { |
|
89 Ok(()) => (), |
|
90 Err(e) => debug!("Error in IO task: {}", e), |
|
91 }, |
|
92 Token(token) => match hw_network.client_readable(&poll, token) { |
|
93 Ok(()) => (), |
|
94 Err(e) => debug!("Error reading from client socket {}: {}", token, e), |
|
95 }, |
|
96 } |
|
97 } |
|
98 if event.is_writable() { |
|
99 match event.token() { |
|
100 utils::SERVER_TOKEN | utils::SECURE_SERVER_TOKEN | utils::IO_TOKEN => { |
|
101 unreachable!() |
|
102 } |
|
103 Token(token) => match hw_network.client_writable(&poll, token) { |
|
104 Ok(()) => (), |
|
105 Err(e) => debug!("Error writing to client socket {}: {}", token, e), |
|
106 }, |
|
107 } |
|
108 } |
|
109 } |
|
110 |
|
111 match hw_network.on_idle(&poll) { |
|
112 Ok(()) => (), |
|
113 Err(e) => debug!("Error in idle handler: {}", e), |
|
114 }; |
|
115 |
|
116 if time.elapsed() > Duration::from_secs(1) { |
|
117 time = Instant::now(); |
|
118 match hw_network.handle_timeout(&mut poll) { |
|
119 Ok(()) => (), |
|
120 Err(e) => debug!("Error in timer event: {}", e), |
|
121 } |
|
122 } |
|
123 } |
|
124 } |
56 } |