记录桌面网络探测失败

桌面网络状态探测保留 DNS 和 TCP 失败原因日志

桌面壳配置检查拒绝网络探测静默吞错

共享决策日志补充桌面网络探测失败边界
This commit is contained in:
2026-06-20 10:17:53 +08:00
parent 7c8ef52e86
commit 15faa50992
3 changed files with 70 additions and 13 deletions
@@ -28,21 +28,57 @@ pub(crate) fn desktop_network_status_payload(is_online: bool) -> Value {
})
}
fn resolve_desktop_network_reachability(
target: Option<(String, u16)>,
timeout: Duration,
) -> Result<bool, String> {
let Some((host, port)) = target else {
return Err("network probe target unavailable".to_string());
};
let addresses = (host.as_str(), port)
.to_socket_addrs()
.map_err(|error| format!("resolve {host}:{port} failed: {error}"))?;
let mut resolved_address = false;
let mut last_connect_error: Option<String> = None;
for address in addresses {
resolved_address = true;
match TcpStream::connect_timeout(&address, timeout) {
Ok(stream) => {
drop(stream);
return Ok(true);
}
Err(error) => {
last_connect_error = Some(error.to_string());
}
}
}
if !resolved_address {
return Err(format!("resolve {host}:{port} returned no addresses"));
}
Err(format!(
"connect {host}:{port} failed: {}",
last_connect_error.unwrap_or_else(|| "unknown connection error".to_string())
))
}
fn log_desktop_network_probe_failure(reason: &str) {
eprintln!("desktop network reachability probe failed: {reason}");
}
pub(crate) fn resolve_desktop_network_status() -> Value {
let timeout = Duration::from_millis(DESKTOP_NETWORK_CHECK_TIMEOUT_MS);
let is_reachable = desktop_network_probe_target()
.and_then(|(host, port)| (host.as_str(), port).to_socket_addrs().ok())
.map(|addresses| {
addresses.into_iter().any(|address| {
TcpStream::connect_timeout(&address, timeout)
.map(|stream| {
drop(stream);
true
})
.unwrap_or(false)
})
})
.unwrap_or(false);
let is_reachable =
match resolve_desktop_network_reachability(desktop_network_probe_target(), timeout) {
Ok(is_reachable) => is_reachable,
Err(reason) => {
log_desktop_network_probe_failure(&reason);
false
}
};
desktop_network_status_payload(is_reachable)
}
@@ -138,4 +174,12 @@ mod tests {
})
);
}
#[test]
fn desktop_network_reachability_reports_missing_probe_target() {
assert_eq!(
resolve_desktop_network_reachability(None, Duration::from_millis(1)),
Err("network probe target unavailable".to_string())
);
}
}