{"record":{"id":"4af7d468c6dc78ae","repo":"rustdesk/rustdesk","slug":"invalid-server-address","errorCode":null,"errorMessage":"Invalid server address: {}","messagePattern":"Invalid server address: (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/client.rs","lineNumber":5214,"sourceCode":"        } else {\n            let query_timeout = std::time::Duration::from_millis(3_000);\n            match query_online_states_(&ids, query_timeout).await {\n                Ok((onlines, offlines)) => {\n                    f(onlines, offlines);\n                }\n                Err(e) => {\n                    log::debug!(\"query onlines, {}\", &e);\n                }\n            }\n        }\n    }\n\n    async fn create_online_stream() -> ResultType<Stream> {\n        let (rendezvous_server, _servers, _contained) =\n            crate::get_rendezvous_server(READ_TIMEOUT).await;\n        let tmp: Vec<&str> = rendezvous_server.split(\":\").collect();\n        if tmp.len() != 2 {\n            bail!(\"Invalid server address: {}\", rendezvous_server);\n        }\n        let port: u16 = tmp[1].parse()?;\n        if port == 0 {\n            bail!(\"Invalid server address: {}\", rendezvous_server);\n        }\n        let online_server = format!(\"{}:{}\", tmp[0], port - 1);\n        connect_tcp(online_server, CONNECT_TIMEOUT).await\n    }\n\n    async fn query_online_states_(\n        ids: &Vec<String>,\n        timeout: std::time::Duration,\n    ) -> ResultType<(Vec<String>, Vec<String>)> {\n        let mut msg_out = RendezvousMessage::new();\n        msg_out.set_online_request(OnlineRequest {\n            id: Config::get_id(),\n            peers: ids.clone(),\n            ..Default::default()","sourceCodeStart":5196,"sourceCodeEnd":5232,"githubUrl":"https://github.com/rustdesk/rustdesk/blob/91c9fccbb0f7bfe5f11644d5fbdec9b23fa10540/src/client.rs#L5196-L5232","documentation":"create_online_stream splits the configured rendezvous server address on ':' and requires exactly host:port. If the address has no colon, multiple colons (IPv6 literal), or is empty, this bail fires. The library throws it to fail fast instead of panicking on the tmp[1] index later.","triggerScenarios":"Calling create_online_stream (via query_online_states) when the rendezvous_server string returned by get_rendezvous_server is not of the form 'host:port' — e.g. 'rs-ny.rustdesk.com' without a port, 'host:8000:extra', or an unbracketed IPv6 literal '::1'.","commonSituations":"Custom rendezvous-server configured without a port in the client config; config value corrupted or truncated; IPv6 server address entered without square brackets; environment override (RENDEZVOUS_SERVERS) with malformed entries.","solutions":["Set the rendezvous server to a valid 'host:port' pair (e.g. 'rs-ny.example.com:21116') in the client config.","If using IPv6, wrap the address in brackets: '[2001:db8::1]:21116'.","Check env/config overrides (RENDEZVOUS_SERVERS / custom server settings) for stray characters, spaces, or extra colons.","Log rendezvous_server at this point to see the offending value before fixing config."],"exampleFix":"// config before\n rendezvous_server = \"rs-ny.example.com\"\n// after\n rendezvous_server = \"rs-ny.example.com:21116\"","handlingStrategy":"validation","validationCode":"fn is_valid_rendezvous_addr(addr: &str) -> bool {\n    match addr.rsplit_once(':') {\n        Some((host, port)) => !host.is_empty() && port.parse::<u16>().map(|p| p > 0).unwrap_or(false),\n        None => false,\n    }\n}","typeGuard":null,"tryCatchPattern":"match create_online_stream().await {\n    Ok(s) => s,\n    Err(e) if e.to_string().contains(\"Invalid server address\") => {\n        eprintln!(\"fix rendezvous server config, got: {}\", cfg.rendezvous_server);\n        return Err(e);\n    }\n    Err(e) => return Err(e),\n}","preventionTips":["Validate the rendezvous server string (host:port) at config load time","Always specify an explicit non-zero port; use brackets for IPv6 literals","Add a unit test over server config parsing"],"tags":["network","config","address-parsing"],"backgroundTag":"invalid-url-format","analyzedSha":"91c9fccbb0f7bfe5f11644d5fbdec9b23fa10540","analyzedAt":"2026-09-10T19:53:44.083Z","contentChangedAt":"2026-09-10T19:53:44.083Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}