ipv6 support for direct connection, todo: UI input check, relay port

change based on ipv6
This commit is contained in:
rustdesk
2023-01-04 18:35:31 +08:00
parent fec4e3a049
commit 55962f2fc9
5 changed files with 99 additions and 11 deletions

View File

@@ -167,7 +167,7 @@ impl Client {
interface: impl Interface,
) -> ResultType<(Stream, bool)> {
// to-do: remember the port for each peer, so that we can retry easier
if hbb_common::is_ipv4_str(peer) {
if hbb_common::is_ip_str(peer) {
return Ok((
socket_client::connect_tcp(
crate::check_port(peer, RELAY_PORT + 1),
@@ -376,7 +376,8 @@ impl Client {
log::info!("peer address: {}, timeout: {}", peer, connect_timeout);
let start = std::time::Instant::now();
// NOTICE: Socks5 is be used event in intranet. Which may be not a good way.
let mut conn = socket_client::connect_tcp_local(peer, Some(local_addr), connect_timeout).await;
let mut conn =
socket_client::connect_tcp_local(peer, Some(local_addr), connect_timeout).await;
let mut direct = !conn.is_err();
if interface.is_force_relay() || conn.is_err() {
if !relay_server.is_empty() {
@@ -1847,7 +1848,10 @@ pub trait Interface: Send + Clone + 'static + Sized {
fn get_login_config_handler(&self) -> Arc<RwLock<LoginConfigHandler>>;
fn set_force_relay(&self, direct: bool, received: bool) {
self.get_login_config_handler().write().unwrap().set_force_relay(direct, received);
self.get_login_config_handler()
.write()
.unwrap()
.set_force_relay(direct, received);
}
fn is_force_relay(&self) -> bool {
self.get_login_config_handler().read().unwrap().force_relay

View File

@@ -21,7 +21,7 @@ use hbb_common::{
anyhow::bail,
compress::compress as compress_func,
config::{self, Config, COMPRESS_LEVEL, RENDEZVOUS_TIMEOUT},
get_version_number, log,
get_version_number, is_ipv6_str, log,
message_proto::*,
protobuf::Enum,
protobuf::Message as _,
@@ -477,6 +477,12 @@ pub fn username() -> String {
#[inline]
pub fn check_port<T: std::string::ToString>(host: T, port: i32) -> String {
let host = host.to_string();
if is_ipv6_str(&host) {
if host.contains("[") {
return host;
}
return format!("[{}]:{}", host, port);
}
if !host.contains(":") {
return format!("{}:{}", host, port);
}
@@ -706,3 +712,17 @@ pub fn make_fd_to_json(id: i32, path: String, entries: &Vec<FileEntry>) -> Strin
fd_json.insert("entries".into(), json!(entries_out));
serde_json::to_string(&fd_json).unwrap_or("".into())
}
#[cfg(test)]
mod test_common {
use super::*;
#[test]
fn test_check_port() {
assert_eq!(check_port("[1:2]:12", 32), "[1:2]:12");
assert_eq!(check_port("1:2", 32), "[1:2]:32");
assert_eq!(check_port("1.1.1.1", 32), "1.1.1.1:32");
assert_eq!(check_port("1.1.1.1:32", 32), "1.1.1.1:32");
assert_eq!(check_port("test.com:32", 0), "test.com:32");
}
}

View File

@@ -506,8 +506,7 @@ async fn direct_server(server: ServerPtr) {
let disabled = Config::get_option("direct-server").is_empty();
if !disabled && listener.is_none() {
port = get_direct_port();
let addr = format!("0.0.0.0:{}", port);
match hbb_common::tcp::new_listener(&addr, false).await {
match hbb_common::tcp::listen_any(port as _).await {
Ok(l) => {
listener = Some(l);
log::info!(
@@ -518,8 +517,8 @@ async fn direct_server(server: ServerPtr) {
Err(err) => {
// to-do: pass to ui
log::error!(
"Failed to start direct server on : {}, error: {}",
addr,
"Failed to start direct server on port: {}, error: {}",
port,
err
);
loop {