mirror of
https://github.com/rustdesk/rustdesk-server.git
synced 2026-08-27 04:28:08 +00:00
bind interface and refactor doc
This commit is contained in:
+51
-22
@@ -16,7 +16,7 @@ use hbb_common::{
|
||||
register_pk_response::Result::{TOO_FREQUENT, UUID_MISMATCH},
|
||||
*,
|
||||
},
|
||||
tcp::{listen_any, FramedStream},
|
||||
tcp::FramedStream,
|
||||
timeout,
|
||||
tokio::{
|
||||
self,
|
||||
@@ -98,18 +98,25 @@ enum LoopFailure {
|
||||
}
|
||||
|
||||
impl RendezvousServer {
|
||||
pub fn start(port: i32, serial: i32, key: &str, rmem: usize) -> ResultType<()> {
|
||||
Self::start_with_bind(None, port, serial, key, rmem)
|
||||
}
|
||||
|
||||
#[tokio::main(flavor = "multi_thread")]
|
||||
pub async fn start(port: i32, serial: i32, key: &str, rmem: usize) -> ResultType<()> {
|
||||
pub async fn start_with_bind(
|
||||
bind_addr: Option<IpAddr>,
|
||||
port: i32,
|
||||
serial: i32,
|
||||
key: &str,
|
||||
rmem: usize,
|
||||
) -> ResultType<()> {
|
||||
let (key, sk) = Self::get_server_sk(key);
|
||||
let nat_port = port - 1;
|
||||
let ws_port = port + 2;
|
||||
let pm = PeerMap::new().await?;
|
||||
log::info!("serial={}", serial);
|
||||
let rendezvous_servers = get_servers(&get_arg("rendezvous-servers"), "rendezvous-servers");
|
||||
log::info!("Listening on tcp/udp :{}", port);
|
||||
log::info!("Listening on tcp :{}, extra port for NAT test", nat_port);
|
||||
log::info!("Listening on websocket :{}", ws_port);
|
||||
let mut socket = create_udp_listener(port, rmem).await?;
|
||||
let mut socket = create_udp_listener(bind_addr, port, rmem).await?;
|
||||
let (tx, mut rx) = mpsc::unbounded_channel::<Data>();
|
||||
let software_url = get_arg("software-url");
|
||||
let version = hbb_common::get_version_from_url(&software_url);
|
||||
@@ -147,15 +154,17 @@ impl RendezvousServer {
|
||||
log::info!("local-ip: {:?}", rs.inner.local_ip);
|
||||
std::env::set_var("PORT_FOR_API", port.to_string());
|
||||
rs.parse_relay_servers(&get_arg("relay-servers"));
|
||||
let mut listener = create_tcp_listener(port).await?;
|
||||
let mut listener2 = create_tcp_listener(nat_port).await?;
|
||||
let mut listener3 = create_tcp_listener(ws_port).await?;
|
||||
let test_addr = std::env::var("TEST_HBBS").unwrap_or_default();
|
||||
if std::env::var("ALWAYS_USE_RELAY")
|
||||
.unwrap_or_default()
|
||||
.to_uppercase()
|
||||
== "Y"
|
||||
{
|
||||
let mut listener = create_tcp_listener(bind_addr, port).await?;
|
||||
let mut listener2 = create_tcp_listener(bind_addr, nat_port).await?;
|
||||
let mut listener3 = create_tcp_listener(bind_addr, ws_port).await?;
|
||||
log::info!("Listening on tcp/udp {}", listener.local_addr()?);
|
||||
log::info!(
|
||||
"Listening on tcp {}, extra port for NAT test",
|
||||
listener2.local_addr()?
|
||||
);
|
||||
log::info!("Listening on websocket {}", listener3.local_addr()?);
|
||||
let test_addr = get_arg("TEST_HBBS");
|
||||
if get_arg("ALWAYS_USE_RELAY").to_uppercase() == "Y" {
|
||||
ALWAYS_USE_RELAY.store(true, Ordering::SeqCst);
|
||||
}
|
||||
log::info!(
|
||||
@@ -204,19 +213,19 @@ impl RendezvousServer {
|
||||
{
|
||||
LoopFailure::UdpSocket => {
|
||||
drop(socket);
|
||||
socket = create_udp_listener(port, rmem).await?;
|
||||
socket = create_udp_listener(bind_addr, port, rmem).await?;
|
||||
}
|
||||
LoopFailure::Listener => {
|
||||
drop(listener);
|
||||
listener = create_tcp_listener(port).await?;
|
||||
listener = create_tcp_listener(bind_addr, port).await?;
|
||||
}
|
||||
LoopFailure::Listener2 => {
|
||||
drop(listener2);
|
||||
listener2 = create_tcp_listener(nat_port).await?;
|
||||
listener2 = create_tcp_listener(bind_addr, nat_port).await?;
|
||||
}
|
||||
LoopFailure::Listener3 => {
|
||||
drop(listener3);
|
||||
listener3 = create_tcp_listener(ws_port).await?;
|
||||
listener3 = create_tcp_listener(bind_addr, ws_port).await?;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1352,7 +1361,15 @@ async fn send_rk_res(
|
||||
socket.send(&msg_out, addr).await
|
||||
}
|
||||
|
||||
async fn create_udp_listener(port: i32, rmem: usize) -> ResultType<FramedSocket> {
|
||||
async fn create_udp_listener(
|
||||
bind_addr: Option<IpAddr>,
|
||||
port: i32,
|
||||
rmem: usize,
|
||||
) -> ResultType<FramedSocket> {
|
||||
if let Some(bind_addr) = bind_addr {
|
||||
let addr = SocketAddr::new(bind_addr, port as _);
|
||||
return FramedSocket::new_reuse(&addr, true, rmem).await;
|
||||
}
|
||||
let addr = SocketAddr::new(IpAddr::V6(Ipv6Addr::UNSPECIFIED), port as _);
|
||||
if let Ok(s) = FramedSocket::new_reuse(&addr, true, rmem).await {
|
||||
log::debug!("listen on udp {:?}", s.local_addr());
|
||||
@@ -1365,8 +1382,20 @@ async fn create_udp_listener(port: i32, rmem: usize) -> ResultType<FramedSocket>
|
||||
}
|
||||
|
||||
#[inline]
|
||||
async fn create_tcp_listener(port: i32) -> ResultType<TcpListener> {
|
||||
let s = listen_any(port as _).await?;
|
||||
async fn create_tcp_listener(bind_addr: Option<IpAddr>, port: i32) -> ResultType<TcpListener> {
|
||||
let s = listen_tcp(bind_addr, port as _).await?;
|
||||
log::debug!("listen on tcp {:?}", s.local_addr());
|
||||
Ok(s)
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
#[hbb_common::tokio::test]
|
||||
async fn udp_listener_uses_bind_address() {
|
||||
let bind_addr = IpAddr::V4(Ipv4Addr::LOCALHOST);
|
||||
let socket = create_udp_listener(Some(bind_addr), 0, 0).await.unwrap();
|
||||
assert_eq!(socket.local_addr().unwrap().ip(), bind_addr);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user