离线时才检测服务器地址

This commit is contained in:
lubeilin
2024-03-24 09:18:12 +08:00
parent ae983f014b
commit 69da6de1ed
2 changed files with 77 additions and 50 deletions
+8 -41
View File
@@ -1,4 +1,3 @@
use std::net::ToSocketAddrs;
use std::sync::Arc;
use std::time::Duration;
@@ -16,10 +15,14 @@ pub fn addr_request(
context: Context,
current_device_info: Arc<AtomicCell<CurrentDeviceInfo>>,
server_cipher: Cipher,
config: BaseConfigInfo,
_config: BaseConfigInfo,
) {
pub_address_request(scheduler, context, current_device_info.clone(), server_cipher);
domain_request(scheduler,current_device_info,config);
pub_address_request(
scheduler,
context,
current_device_info.clone(),
server_cipher,
);
}
pub fn pub_address_request(
scheduler: &Scheduler,
@@ -36,43 +39,7 @@ pub fn pub_address_request(
log::info!("定时任务停止");
}
}
pub fn domain_request(
scheduler: &Scheduler,
current_device_info: Arc<AtomicCell<CurrentDeviceInfo>>,
config: BaseConfigInfo,
) {
domain_request0(&current_device_info, &config);
// 120秒发送一次
let rs = scheduler.timeout(Duration::from_secs(120), |s| {
domain_request(s, current_device_info, config)
});
if !rs {
log::info!("定时任务停止");
}
}
pub fn domain_request0(
current_device: &AtomicCell<CurrentDeviceInfo>,
config: &BaseConfigInfo,
) {
let mut current_dev = current_device.load();
// 探测服务端地址变化
if let Ok(mut addr) = config.server_addr.to_socket_addrs() {
if let Some(addr) = addr.next() {
if addr != current_dev.connect_server {
let mut tmp = current_dev.clone();
tmp.connect_server = addr;
let rs = current_device.compare_exchange(current_dev, tmp);
current_dev.connect_server = addr;
log::info!(
"服务端地址变化,旧地址:{},新地址:{},替换结果:{}",
current_dev.connect_server,
addr,
rs.is_ok()
);
}
}
}
}
pub fn addr_request0(
context: &Context,
current_device: &AtomicCell<CurrentDeviceInfo>,
+69 -9
View File
@@ -1,3 +1,11 @@
use std::io;
use std::net::{SocketAddr, ToSocketAddrs};
use std::sync::Arc;
use std::time::{Duration, Instant};
use crossbeam_utils::atomic::AtomicCell;
use mio::net::TcpStream;
use crate::channel::context::Context;
use crate::channel::idle::{Idle, IdleType};
use crate::channel::sender::AcceptSocketSender;
@@ -6,12 +14,6 @@ use crate::handle::handshaker::Handshake;
use crate::handle::{handshaker, BaseConfigInfo, ConnectStatus, CurrentDeviceInfo};
use crate::util::Scheduler;
use crate::{ErrorInfo, VntCallback};
use crossbeam_utils::atomic::AtomicCell;
use mio::net::TcpStream;
use std::io;
use std::net::SocketAddr;
use std::sync::Arc;
use std::time::Duration;
pub fn idle_route<Call: VntCallback>(
scheduler: &Scheduler,
@@ -29,6 +31,29 @@ pub fn idle_route<Call: VntCallback>(
}
}
pub fn idle_gateway<Call: VntCallback>(
scheduler: &Scheduler,
context: Context,
current_device_info: Arc<AtomicCell<CurrentDeviceInfo>>,
config: BaseConfigInfo,
tcp_socket_sender: AcceptSocketSender<(TcpStream, SocketAddr, Option<Vec<u8>>)>,
call: Call,
connect_count: usize,
handshake: Handshake,
) {
let time = Instant::now();
idle_gateway_(
scheduler,
context,
current_device_info,
config,
tcp_socket_sender,
call,
connect_count,
handshake,
time,
);
}
pub fn idle_gateway_<Call: VntCallback>(
scheduler: &Scheduler,
context: Context,
current_device_info: Arc<AtomicCell<CurrentDeviceInfo>>,
@@ -37,6 +62,7 @@ pub fn idle_gateway<Call: VntCallback>(
call: Call,
mut connect_count: usize,
handshake: Handshake,
mut time: Instant,
) {
idle_gateway0(
&context,
@@ -46,9 +72,10 @@ pub fn idle_gateway<Call: VntCallback>(
&call,
&mut connect_count,
&handshake,
&mut time,
);
let rs = scheduler.timeout(Duration::from_secs(5), move |s| {
idle_gateway(
idle_gateway_(
s,
context,
current_device_info,
@@ -57,6 +84,7 @@ pub fn idle_gateway<Call: VntCallback>(
call,
connect_count,
handshake,
time,
)
});
if !rs {
@@ -71,6 +99,7 @@ fn idle_gateway0<Call: VntCallback>(
call: &Call,
connect_count: &mut usize,
handshake: &Handshake,
time: &mut Instant,
) {
if let Err(e) = check_gateway_channel(
context,
@@ -80,6 +109,7 @@ fn idle_gateway0<Call: VntCallback>(
call,
connect_count,
handshake,
time,
) {
let cur = current_device.load();
call.error(ErrorInfo::new_msg(
@@ -113,16 +143,22 @@ fn idle_route0<Call: VntCallback>(
fn check_gateway_channel<Call: VntCallback>(
context: &Context,
current_device: &AtomicCell<CurrentDeviceInfo>,
current_device_info: &AtomicCell<CurrentDeviceInfo>,
config: &BaseConfigInfo,
tcp_socket_sender: &AcceptSocketSender<(TcpStream, SocketAddr, Option<Vec<u8>>)>,
call: &Call,
count: &mut usize,
handshake: &Handshake,
time: &mut Instant,
) -> io::Result<()> {
let current_device = current_device.load();
let mut current_device = current_device_info.load();
if current_device.status.offline() {
*count += 1;
if time.elapsed() < Duration::from_secs(6 * 60) {
// 探测服务器地址
current_device = domain_request0(current_device_info, config);
*time = Instant::now()
}
//需要重连
call.connect(ConnectInfo::new(*count, current_device.connect_server));
log::info!("发送握手请求,{:?}", config);
@@ -149,3 +185,27 @@ fn check_gateway_channel<Call: VntCallback>(
}
Ok(())
}
pub fn domain_request0(
current_device: &AtomicCell<CurrentDeviceInfo>,
config: &BaseConfigInfo,
) -> CurrentDeviceInfo {
let mut current_dev = current_device.load();
// 探测服务端地址变化
if let Ok(mut addr) = config.server_addr.to_socket_addrs() {
if let Some(addr) = addr.next() {
if addr != current_dev.connect_server {
let mut tmp = current_dev.clone();
tmp.connect_server = addr;
let rs = current_device.compare_exchange(current_dev, tmp);
current_dev.connect_server = addr;
log::info!(
"服务端地址变化,旧地址:{},新地址:{},替换结果:{}",
current_dev.connect_server,
addr,
rs.is_ok()
);
}
}
}
current_dev
}