mirror of
https://github.com/weyne85/rustdesk.git
synced 2025-10-29 17:00:05 +00:00
lan discovery will be done soon
Signed-off-by: fufesou <shuanglongchen@yeah.net>
This commit is contained in:
@@ -90,6 +90,7 @@ pub enum Data {
|
||||
ConfirmedKey(Option<(Vec<u8>, Vec<u8>)>),
|
||||
RawMessage(Vec<u8>),
|
||||
FS(FS),
|
||||
SessionsUpdated,
|
||||
Test,
|
||||
}
|
||||
|
||||
|
||||
@@ -28,6 +28,7 @@ mod connection;
|
||||
pub mod input_service;
|
||||
mod service;
|
||||
mod video_service;
|
||||
mod udp;
|
||||
|
||||
use hbb_common::tcp::new_listener;
|
||||
|
||||
@@ -261,6 +262,7 @@ pub fn check_zombie() {
|
||||
|
||||
#[tokio::main]
|
||||
pub async fn start_server(is_server: bool, _tray: bool) {
|
||||
// TODO: Add a graceful shutdown handler, and attach all servers to that handler.
|
||||
#[cfg(target_os = "linux")]
|
||||
{
|
||||
log::info!("DISPLAY={:?}", std::env::var("DISPLAY"));
|
||||
@@ -273,6 +275,13 @@ pub async fn start_server(is_server: bool, _tray: bool) {
|
||||
std::process::exit(-1);
|
||||
}
|
||||
});
|
||||
let _server_guard = match udp::start_udp_server().await {
|
||||
Ok(s) => Some(s),
|
||||
Err(e) => {
|
||||
log::warn!("Failed to start udp server {}", e);
|
||||
None
|
||||
}
|
||||
};
|
||||
input_service::fix_key_down_timeout_loop();
|
||||
crate::RendezvousMediator::start_all().await;
|
||||
} else {
|
||||
|
||||
105
src/server/udp.rs
Normal file
105
src/server/udp.rs
Normal file
@@ -0,0 +1,105 @@
|
||||
/// udp server
|
||||
///
|
||||
/// eg. discovery
|
||||
///
|
||||
use hbb_common::{base_proto::PeerInfo, config::SERVER_UDP_PORT, ResultType};
|
||||
use socket_cs::udp::{Server, UdpHandlers};
|
||||
|
||||
/// Simple copy from ../connections.rs#send_logon_response
|
||||
/// Should be merged into one function.
|
||||
fn get_peer_info() -> PeerInfo {
|
||||
let username = crate::platform::get_active_username();
|
||||
#[allow(unused_mut)]
|
||||
let mut sas_enabled = false;
|
||||
#[cfg(windows)]
|
||||
if crate::platform::is_root() {
|
||||
sas_enabled = true;
|
||||
}
|
||||
PeerInfo {
|
||||
hostname: whoami::hostname(),
|
||||
username,
|
||||
platform: whoami::platform().to_string(),
|
||||
version: crate::VERSION.to_owned(),
|
||||
sas_enabled,
|
||||
..Default::default()
|
||||
}
|
||||
}
|
||||
|
||||
mod discovery {
|
||||
use super::get_peer_info;
|
||||
use crate::ipc;
|
||||
use hbb_common::{
|
||||
base_proto::PeerInfo,
|
||||
config::{PeerConfig, PeerInfoSerde},
|
||||
discovery_proto::{Discovery as DiscoveryProto, DiscoveryBack as DiscoveryBackProto},
|
||||
log, protobuf,
|
||||
tokio::runtime::Runtime,
|
||||
ResultType,
|
||||
};
|
||||
use socket_cs::{discovery::*, udp::UdpHandlers};
|
||||
|
||||
fn get_discovery_back_info() -> DiscoveryBackProto {
|
||||
let peer = get_peer_info();
|
||||
DiscoveryBackProto {
|
||||
id: ipc::get_id(),
|
||||
peer: protobuf::MessageField::from_option(Some(peer)),
|
||||
..Default::default()
|
||||
}
|
||||
}
|
||||
|
||||
fn process_discovery_back(info: DiscoveryBackProto) {
|
||||
let mut config = PeerConfig::load(info.id.as_str());
|
||||
|
||||
let peer = info.peer.as_ref().unwrap();
|
||||
let serde = PeerInfoSerde {
|
||||
username: peer.username.clone(),
|
||||
hostname: peer.hostname.clone(),
|
||||
platform: peer.platform.clone(),
|
||||
};
|
||||
config.info = serde;
|
||||
config.store(info.id.as_str());
|
||||
|
||||
let rt = match Runtime::new() {
|
||||
Ok(r) => r,
|
||||
Err(e) => {
|
||||
log::error!("Failed to notify index window, {}", e);
|
||||
return;
|
||||
}
|
||||
};
|
||||
|
||||
async fn notify_index_window() -> ResultType<()> {
|
||||
let ms_timeout = 1000;
|
||||
let mut c = ipc::connect(ms_timeout, "_index").await?;
|
||||
c.send(&ipc::Data::SessionsUpdated).await?;
|
||||
Ok(())
|
||||
}
|
||||
rt.block_on(async move {
|
||||
if let Err(e) = notify_index_window().await {
|
||||
log::error!("Failed to notify index window, {}", e);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// pub(crate) fn lan_discover();
|
||||
|
||||
pub(super) fn handle_discovery(handlers: UdpHandlers) -> UdpHandlers {
|
||||
let info = get_discovery_back_info();
|
||||
handlers
|
||||
.handle(
|
||||
CMD_DISCOVERY.as_bytes().to_vec(),
|
||||
Box::new(HandlerDiscovery::new(Some(|| true), info)),
|
||||
)
|
||||
.handle(
|
||||
CMD_DISCOVERY_BACK.as_bytes().to_vec(),
|
||||
Box::new(HandlerDiscoveryBack::new(process_discovery_back)),
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
pub(super) async fn start_udp_server() -> ResultType<Server> {
|
||||
let handlers = discovery::handle_discovery(UdpHandlers::new());
|
||||
|
||||
let mut server = Server::create(SERVER_UDP_PORT)?;
|
||||
server.start(handlers).await?;
|
||||
Ok(server)
|
||||
}
|
||||
51
src/ui.rs
51
src/ui.rs
@@ -86,6 +86,8 @@ pub fn start(args: &mut [String]) {
|
||||
let childs: Childs = Default::default();
|
||||
let cloned = childs.clone();
|
||||
std::thread::spawn(move || check_zombie(cloned));
|
||||
let cloned = childs.clone();
|
||||
tokio::spawn(async move {start_ipc(cloned)});
|
||||
crate::common::check_software_update();
|
||||
frame.event_handler(UI::new(childs));
|
||||
frame.sciter_handler(UIHostHandler {});
|
||||
@@ -644,6 +646,55 @@ pub fn check_zombie(childs: Childs) {
|
||||
}
|
||||
}
|
||||
|
||||
// TODO: Duplicated code.
|
||||
// Need more generic and better shutdown handler
|
||||
#[tokio::main(flavor = "current_thread")]
|
||||
async fn start_ipc(childs: Childs) {
|
||||
match ipc::new_listener("_index").await {
|
||||
Ok(mut incoming) => {
|
||||
while let Some(result) = incoming.next().await {
|
||||
match result {
|
||||
Ok(stream) => {
|
||||
let mut stream = ipc::Connection::new(stream);
|
||||
let childs = childs.clone();
|
||||
tokio::spawn(async move {
|
||||
loop {
|
||||
tokio::select! {
|
||||
res = stream.next() => {
|
||||
match res {
|
||||
Err(err) => {
|
||||
log::info!("cm ipc connection closed: {}", err);
|
||||
break;
|
||||
}
|
||||
Ok(Some(data)) => {
|
||||
match data {
|
||||
ipc::Data::SessionsUpdated => {
|
||||
childs.lock().unwrap().0 = true;
|
||||
}
|
||||
_ => {
|
||||
}
|
||||
}
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
Err(err) => {
|
||||
log::error!("Couldn't get index client: {:?}", err);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Err(err) => {
|
||||
log::error!("Failed to start index ipc server: {}", err);
|
||||
}
|
||||
}
|
||||
std::process::exit(-1);
|
||||
}
|
||||
|
||||
// notice: avoiding create ipc connection repeatedly,
|
||||
// because windows named pipe has serious memory leak issue.
|
||||
#[tokio::main(flavor = "current_thread")]
|
||||
|
||||
Reference in New Issue
Block a user