mirror of
https://github.com/rustdesk/rustdesk-server.git
synced 2025-07-04 00:35:35 +00:00
This commit is contained in:
parent
39153ce147
commit
acaee5b7a4
@ -89,12 +89,7 @@ enum LoopFailure {
|
|||||||
|
|
||||||
impl RendezvousServer {
|
impl RendezvousServer {
|
||||||
#[tokio::main(flavor = "multi_thread")]
|
#[tokio::main(flavor = "multi_thread")]
|
||||||
pub async fn start(
|
pub async fn start(port: i32, serial: i32, key: &str, rmem: usize) -> ResultType<()> {
|
||||||
port: i32,
|
|
||||||
serial: i32,
|
|
||||||
key: &str,
|
|
||||||
rmem: usize,
|
|
||||||
) -> ResultType<()> {
|
|
||||||
let (key, sk) = Self::get_server_sk(key);
|
let (key, sk) = Self::get_server_sk(key);
|
||||||
let addr = format!("0.0.0.0:{}", port);
|
let addr = format!("0.0.0.0:{}", port);
|
||||||
let addr2 = format!("0.0.0.0:{}", port - 1);
|
let addr2 = format!("0.0.0.0:{}", port - 1);
|
||||||
@ -112,6 +107,17 @@ impl RendezvousServer {
|
|||||||
if !version.is_empty() {
|
if !version.is_empty() {
|
||||||
log::info!("software_url: {}, version: {}", software_url, version);
|
log::info!("software_url: {}, version: {}", software_url, version);
|
||||||
}
|
}
|
||||||
|
let mask = get_arg("mask").parse().ok();
|
||||||
|
let local_ip = if mask.is_none() {
|
||||||
|
"".to_owned()
|
||||||
|
} else {
|
||||||
|
get_arg_or(
|
||||||
|
"local-ip",
|
||||||
|
local_ip_address::local_ip()
|
||||||
|
.map(|x| x.to_string())
|
||||||
|
.unwrap_or_default(),
|
||||||
|
)
|
||||||
|
};
|
||||||
let mut rs = Self {
|
let mut rs = Self {
|
||||||
tcp_punch: Arc::new(Mutex::new(HashMap::new())),
|
tcp_punch: Arc::new(Mutex::new(HashMap::new())),
|
||||||
pm,
|
pm,
|
||||||
@ -124,13 +130,8 @@ impl RendezvousServer {
|
|||||||
version,
|
version,
|
||||||
software_url,
|
software_url,
|
||||||
sk,
|
sk,
|
||||||
mask: get_arg("mask").parse().ok(),
|
mask,
|
||||||
local_ip: get_arg_or(
|
local_ip,
|
||||||
"local-ip",
|
|
||||||
local_ip_address::local_ip()
|
|
||||||
.map(|x| x.to_string())
|
|
||||||
.unwrap_or_default(),
|
|
||||||
),
|
|
||||||
}),
|
}),
|
||||||
};
|
};
|
||||||
log::info!("mask: {:?}", rs.inner.mask);
|
log::info!("mask: {:?}", rs.inner.mask);
|
||||||
@ -498,9 +499,13 @@ impl RendezvousServer {
|
|||||||
rr.set_pk(pk);
|
rr.set_pk(pk);
|
||||||
}
|
}
|
||||||
let mut msg_out = RendezvousMessage::new();
|
let mut msg_out = RendezvousMessage::new();
|
||||||
|
if !rr.relay_server.is_empty() {
|
||||||
if self.is_lan(addr_b) {
|
if self.is_lan(addr_b) {
|
||||||
// https://github.com/rustdesk/rustdesk-server/issues/24
|
// https://github.com/rustdesk/rustdesk-server/issues/24
|
||||||
rr.relay_server = self.inner.local_ip.clone();
|
rr.relay_server = self.inner.local_ip.clone();
|
||||||
|
} else if rr.relay_server == self.inner.local_ip {
|
||||||
|
rr.relay_server = self.get_relay_server(addr.ip(), addr_b.ip());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
msg_out.set_relay_response(rr);
|
msg_out.set_relay_response(rr);
|
||||||
allow_err!(self.send_to_tcp_sync(msg_out, addr_b).await);
|
allow_err!(self.send_to_tcp_sync(msg_out, addr_b).await);
|
||||||
@ -659,6 +664,7 @@ impl RendezvousServer {
|
|||||||
key: &str,
|
key: &str,
|
||||||
ws: bool,
|
ws: bool,
|
||||||
) -> ResultType<(RendezvousMessage, Option<SocketAddr>)> {
|
) -> ResultType<(RendezvousMessage, Option<SocketAddr>)> {
|
||||||
|
let mut ph = ph;
|
||||||
if !key.is_empty() && ph.licence_key != key {
|
if !key.is_empty() && ph.licence_key != key {
|
||||||
let mut msg_out = RendezvousMessage::new();
|
let mut msg_out = RendezvousMessage::new();
|
||||||
msg_out.set_punch_hole_response(PunchHoleResponse {
|
msg_out.set_punch_hole_response(PunchHoleResponse {
|
||||||
@ -689,20 +695,13 @@ impl RendezvousServer {
|
|||||||
let mut msg_out = RendezvousMessage::new();
|
let mut msg_out = RendezvousMessage::new();
|
||||||
let peer_is_lan = self.is_lan(peer_addr);
|
let peer_is_lan = self.is_lan(peer_addr);
|
||||||
let is_lan = self.is_lan(addr);
|
let is_lan = self.is_lan(addr);
|
||||||
|
let mut relay_server = self.get_relay_server(addr.ip(), peer_addr.ip());
|
||||||
if unsafe { ALWAYS_USE_RELAY } || (peer_is_lan ^ is_lan) {
|
if unsafe { ALWAYS_USE_RELAY } || (peer_is_lan ^ is_lan) {
|
||||||
let relay_server = if peer_is_lan {
|
if peer_is_lan {
|
||||||
// https://github.com/rustdesk/rustdesk-server/issues/24
|
// https://github.com/rustdesk/rustdesk-server/issues/24
|
||||||
self.inner.local_ip.clone()
|
relay_server = self.inner.local_ip.clone()
|
||||||
} else {
|
|
||||||
self.get_relay_server(addr.ip(), peer_addr.ip())
|
|
||||||
};
|
|
||||||
if !relay_server.is_empty() {
|
|
||||||
msg_out.set_request_relay(RequestRelay {
|
|
||||||
relay_server,
|
|
||||||
..Default::default()
|
|
||||||
});
|
|
||||||
return Ok((msg_out, Some(peer_addr)));
|
|
||||||
}
|
}
|
||||||
|
ph.nat_type = NatType::SYMMETRIC.into(); // will force relay
|
||||||
}
|
}
|
||||||
let same_intranet = !ws
|
let same_intranet = !ws
|
||||||
&& match peer_addr {
|
&& match peer_addr {
|
||||||
@ -716,7 +715,6 @@ impl RendezvousServer {
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
let socket_addr = AddrMangle::encode(addr);
|
let socket_addr = AddrMangle::encode(addr);
|
||||||
let relay_server = self.get_relay_server(addr.ip(), peer_addr.ip());
|
|
||||||
if same_intranet {
|
if same_intranet {
|
||||||
log::debug!(
|
log::debug!(
|
||||||
"Fetch local addr {:?} {:?} request from {:?}",
|
"Fetch local addr {:?} {:?} request from {:?}",
|
||||||
@ -1044,21 +1042,12 @@ impl RendezvousServer {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn handle_listener(
|
async fn handle_listener(&self, stream: TcpStream, addr: SocketAddr, key: &str, ws: bool) {
|
||||||
&self,
|
|
||||||
stream: TcpStream,
|
|
||||||
addr: SocketAddr,
|
|
||||||
key: &str,
|
|
||||||
ws: bool,
|
|
||||||
) {
|
|
||||||
log::debug!("Tcp connection from {:?}, ws: {}", addr, ws);
|
log::debug!("Tcp connection from {:?}, ws: {}", addr, ws);
|
||||||
let mut rs = self.clone();
|
let mut rs = self.clone();
|
||||||
let key = key.to_owned();
|
let key = key.to_owned();
|
||||||
tokio::spawn(async move {
|
tokio::spawn(async move {
|
||||||
allow_err!(
|
allow_err!(rs.handle_listener_inner(stream, addr, &key, ws).await);
|
||||||
rs.handle_listener_inner(stream, addr, &key, ws)
|
|
||||||
.await
|
|
||||||
);
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1078,10 +1067,7 @@ impl RendezvousServer {
|
|||||||
while let Ok(Some(Ok(msg))) = timeout(30_000, b.next()).await {
|
while let Ok(Some(Ok(msg))) = timeout(30_000, b.next()).await {
|
||||||
match msg {
|
match msg {
|
||||||
tungstenite::Message::Binary(bytes) => {
|
tungstenite::Message::Binary(bytes) => {
|
||||||
if !self
|
if !self.handle_tcp(&bytes, &mut sink, addr, key, ws).await {
|
||||||
.handle_tcp(&bytes, &mut sink, addr, key, ws)
|
|
||||||
.await
|
|
||||||
{
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1092,10 +1078,7 @@ impl RendezvousServer {
|
|||||||
let (a, mut b) = Framed::new(stream, BytesCodec::new()).split();
|
let (a, mut b) = Framed::new(stream, BytesCodec::new()).split();
|
||||||
sink = Some(Sink::TcpStream(a));
|
sink = Some(Sink::TcpStream(a));
|
||||||
while let Ok(Some(Ok(bytes))) = timeout(30_000, b.next()).await {
|
while let Ok(Some(Ok(bytes))) = timeout(30_000, b.next()).await {
|
||||||
if !self
|
if !self.handle_tcp(&bytes, &mut sink, addr, key, ws).await {
|
||||||
.handle_tcp(&bytes, &mut sink, addr, key, ws)
|
|
||||||
.await
|
|
||||||
{
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user