From d27f0655072225ecca2f1fefd8a380d4bb121c6b Mon Sep 17 00:00:00 2001 From: lubeilin <1791778603@qq.com> Date: Thu, 7 Mar 2024 21:48:54 +0800 Subject: [PATCH] =?UTF-8?q?[mio]=20=E8=B0=83=E6=95=B4=E9=80=9A=E9=81=93?= =?UTF-8?q?=E4=BD=BF=E7=94=A8=E7=AD=96=E7=95=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- vnt/src/channel/context.rs | 48 +++++++++++++++----------------------- vnt/src/channel/punch.rs | 6 ++++- 2 files changed, 24 insertions(+), 30 deletions(-) diff --git a/vnt/src/channel/context.rs b/vnt/src/channel/context.rs index 2ac454a..eb2c60a 100644 --- a/vnt/src/channel/context.rs +++ b/vnt/src/channel/context.rs @@ -330,48 +330,30 @@ impl RouteTable { impl RouteTable { fn get_route_by_id(&self, id: &Ipv4Addr) -> io::Result { - if let Some((count, v)) = self.route_table.read().get(id) { + if let Some((_count, v)) = self.route_table.read().get(id) { let len = v.len(); if len == 0 { return Err(io::Error::new(io::ErrorKind::NotFound, "route not found")); } - let index = if self.channel_num > 1 { - let index = count.load(Ordering::Relaxed); - count.store(index + 1, Ordering::Relaxed); - index - } else { - 0 - }; - // 基准延迟,选中的路由不能和这个延迟大太多 - let mut rt0 = v[0].0.rt; - let (route, time) = &v[index % len]; + // 因为列表是按延迟排序的,会一直变,直接取第一条是合理的 + let (route, time) = &v[0]; // 刚加入的或者长时间没通信的不使用 - if route.rt - rt0 < 5 - && route.rt != DEFAULT_RT - && time.load().elapsed() < Duration::from_secs(5) - { + if route.rt != DEFAULT_RT && time.load().elapsed() < Duration::from_secs(5) { return Ok(*route); } // 如果指定路由不符合,则遍历路由表找到符合条件的 if len > 1 { - let mut re_rt = false; - for (i, (route, time)) in v.iter().enumerate() { - let recent = time.load().elapsed() < Duration::from_secs(5); - if i == 0 && !recent { - // 如果第一条路由不符合条件,则要重新选择基准延迟 - re_rt = true; - continue; - } - if re_rt && recent { - re_rt = false; - rt0 = route.rt; - } - if recent && route.rt - rt0 < 5 && route.rt != DEFAULT_RT { + for (route, time) in v[1..].iter() { + if route.rt != DEFAULT_RT && time.load().elapsed() < Duration::from_secs(5) { return Ok(*route); } } } + //加一条保底 + if route.is_p2p() && route.rt != DEFAULT_RT { + return Ok(*route); + } } Err(io::Error::new(io::ErrorKind::NotFound, "route not found")) } @@ -397,6 +379,7 @@ impl RouteTable { .entry(id) .or_insert_with(|| (AtomicUsize::new(0), Vec::with_capacity(4))); let mut exist = false; + let mut p2p_num = 0; for (x, time) in list.iter_mut() { if x.metric < route.metric && !self.first_latency { //非优先延迟的情况下 不能比当前的路径更长 @@ -412,6 +395,9 @@ impl RouteTable { time.store(Instant::now()); break; } + if x.is_p2p() { + p2p_num += 1; + } } if exist { list.sort_by_key(|(k, _)| k.rt); @@ -419,9 +405,13 @@ impl RouteTable { let limit_len = if self.first_latency { self.channel_num } else { + if p2p_num >= self.channel_num { + // p2p通道满员了则不再添加 + return; + } if route.metric == 1 { //非优先延迟的情况下 添加了直连的则排除非直连的 - list.retain(|(k, _)| k.metric == 1); + list.retain(|(k, _)| k.is_p2p()); } self.channel_num - 1 }; diff --git a/vnt/src/channel/punch.rs b/vnt/src/channel/punch.rs index 36de987..b6ccdbc 100644 --- a/vnt/src/channel/punch.rs +++ b/vnt/src/channel/punch.rs @@ -317,8 +317,8 @@ impl Punch { self.port_index.insert(id, index); } NatType::Cone => { + let is_cone = self.context.is_cone(); for index in 0..channel_num { - let is_cone = self.context.is_cone(); let len = nat_info.public_ports.len(); for ip in &nat_info.public_ips { let port = nat_info.public_ports[index % len]; @@ -332,6 +332,10 @@ impl Punch { self.context.try_send_all(buf, addr); } } + if !is_cone { + //对称网络数据只发一遍 + break; + } } } }