You need to sign in or sign up before continuing.
Commit 5325b88b authored by nanamicat's avatar nanamicat

time

parent 02909afa
Pipeline #42436 passed with stages
in 58 seconds
...@@ -18,6 +18,7 @@ mod protocol; ...@@ -18,6 +18,7 @@ mod protocol;
mod router; mod router;
mod server; mod server;
mod settings; mod settings;
use hickory_resolver::Resolver; use hickory_resolver::Resolver;
use tokio::time::Instant; use tokio::time::Instant;
...@@ -44,6 +45,7 @@ async fn main() -> anyhow::Result<()> { ...@@ -44,6 +45,7 @@ async fn main() -> anyhow::Result<()> {
let mut timer = time::interval(INTERVAL); let mut timer = time::interval(INTERVAL);
let mut buf = [0; 1500]; let mut buf = [0; 1500];
let start = Instant::now(); let start = Instant::now();
let start_timestamp = SystemTime::now().duration_since(SystemTime::UNIX_EPOCH)?;
let resolver = Resolver::builder_tokio()?.build(); let resolver = Resolver::builder_tokio()?.build();
...@@ -55,12 +57,14 @@ async fn main() -> anyhow::Result<()> { ...@@ -55,12 +57,14 @@ async fn main() -> anyhow::Result<()> {
result = socket.recv_from(&mut buf) => { result = socket.recv_from(&mut buf) => {
let (len, addr) = result?; let (len, addr) = result?;
let now = Instant::now();
let now_timestamp = (start_timestamp + now.duration_since(start)).as_millis() as u32;
tracing::info!("{:?} {:?}", addr, server_addr); tracing::info!("{:?} {:?}", addr, server_addr);
if addr.port() == config.bind.port() if addr.port() == config.bind.port()
&& let Some(peer) = Router::get(&mut routers, addr) && let Some(peer) = Router::get(&mut routers, addr)
&& let Ok((hello, _)) = bincode::decode_from_slice(&buf[..len], bincode::config::standard()) && let Ok((hello, _)) = bincode::decode_from_slice(&buf[..len], bincode::config::standard())
{ {
peer.on_message(&hello); peer.on_message(&hello, now, now_timestamp);
} else if addr.port() == config.server.port } else if addr.port() == config.server.port
&& let Ok((downlink, _)) = bincode::decode_from_slice(&buf[..len], bincode::config::standard()) && let Ok((downlink, _)) = bincode::decode_from_slice(&buf[..len], bincode::config::standard())
&& let Some(uplink) = server.on_message(downlink, &routers_data, &connections[&config.id], &config).await && let Some(uplink) = server.on_message(downlink, &routers_data, &connections[&config.id], &config).await
...@@ -71,8 +75,7 @@ async fn main() -> anyhow::Result<()> { ...@@ -71,8 +75,7 @@ async fn main() -> anyhow::Result<()> {
} }
now = timer.tick() => { now = timer.tick() => {
// to clients let hello = Hello { time: (start_timestamp + now.duration_since(start)).as_millis() as u32 };
let hello = Hello { time: SystemTime::now().duration_since(SystemTime::UNIX_EPOCH)?.as_millis() as u32 };
let len = bincode::encode_into_slice(&hello, &mut buf, bincode::config::standard())?; let len = bincode::encode_into_slice(&hello, &mut buf, bincode::config::standard())?;
for id in connections[&config.id].keys() { for id in connections[&config.id].keys() {
......
...@@ -4,7 +4,6 @@ use crate::settings::{Settings, INTERVAL}; ...@@ -4,7 +4,6 @@ use crate::settings::{Settings, INTERVAL};
use saturating_cast::SaturatingCast; use saturating_cast::SaturatingCast;
use std::collections::BTreeMap; use std::collections::BTreeMap;
use std::net::{IpAddr, Ipv4Addr, SocketAddr}; use std::net::{IpAddr, Ipv4Addr, SocketAddr};
use std::time::SystemTime;
use tokio::time::Instant; use tokio::time::Instant;
pub struct Router { pub struct Router {
...@@ -42,7 +41,7 @@ impl Router { ...@@ -42,7 +41,7 @@ impl Router {
} }
} }
pub fn on_message(&mut self, data: &Hello) { pub fn on_message(&mut self, data: &Hello, now: Instant, now_timestamp: u32) {
let delta = (data.time.wrapping_sub(self.remote_time) as i32 as f32 / INTERVAL.as_millis() as f32).round() as i32; let delta = (data.time.wrapping_sub(self.remote_time) as i32 as f32 / INTERVAL.as_millis() as f32).round() as i32;
match delta { match delta {
-63..=-1 => { -63..=-1 => {
...@@ -52,7 +51,7 @@ impl Router { ...@@ -52,7 +51,7 @@ impl Router {
1..=63 => { 1..=63 => {
self.receive = (self.receive << delta) | 1; self.receive = (self.receive << delta) | 1;
self.remote_time = data.time; self.remote_time = data.time;
self.local_time = Instant::now(); self.local_time = now;
} }
_ => { _ => {
self.remote_time = data.time; self.remote_time = data.time;
...@@ -60,7 +59,7 @@ impl Router { ...@@ -60,7 +59,7 @@ impl Router {
} }
} }
let delay = (SystemTime::now().duration_since(SystemTime::UNIX_EPOCH).unwrap().as_millis() as u32).wrapping_sub(data.time) as i32; let delay = now_timestamp.wrapping_sub(data.time) as i32;
self.delay = delay; //+= (delay - self.delay) / 4; self.delay = delay; //+= (delay - self.delay) / 4;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment