rustdesk 2022-07-14 18:39:42 +08:00
parent 39153ce147
commit acaee5b7a4

View File

@ -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;
} }
} }