Skip to content

Commit 801742f

Browse files
authored
Add ability to fetch discovery URLs (#235)
## Description This implements `Server::discovery_urls()` to retrieve the server's own URL even when the port number was chosen randomly (i.e. the operating system picked an arbitrary free TCP port to listen on). Due to how `ServerRunner::run()` is implemented, this requires `ServerRunner::run_until_cancelled()` for now.
1 parent ffc1c77 commit 801742f

5 files changed

Lines changed: 355 additions & 62 deletions

File tree

Cargo.lock

Lines changed: 50 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -21,16 +21,13 @@ futures-channel = "0.3.30"
2121
futures-core = { version = "0.3.30", default-features = false }
2222
log = "0.4.20"
2323
open62541-sys = "0.4.16"
24+
parking_lot = "0.12.4"
2425
paste = "1.0.14"
2526
serde = { version = "1.0.194", optional = true }
2627
serde_json = { version = "1.0.111", optional = true }
2728
thiserror = "2.0.3"
2829
time = { version = "0.3.38", optional = true }
29-
tokio = { version = "1.38.2", optional = true, features = [
30-
"rt",
31-
"sync",
32-
"time",
33-
] }
30+
tokio = { version = "1.38.2", optional = true, features = ["rt", "sync", "time"] }
3431
uuid = { version = "1.16.0", optional = true }
3532
x509-certificate = { version = "0.24.0", optional = true }
3633
zeroize = { version = "1.8.1", optional = true }
@@ -49,13 +46,7 @@ tokio = { version = "1.35.1", features = ["macros", "rt-multi-thread"] }
4946
[features]
5047
default = ["serde", "time", "tokio", "uuid"]
5148
mbedtls = ["dep:zeroize", "open62541-sys/mbedtls"]
52-
serde = [
53-
"dep:serde",
54-
"dep:serde_json",
55-
"time?/formatting",
56-
"time?/serde",
57-
"uuid?/serde",
58-
]
49+
serde = ["dep:serde", "dep:serde_json", "time?/formatting", "time?/serde", "uuid?/serde"]
5950
time = ["dep:time"]
6051
tokio = ["dep:tokio"]
6152
uuid = ["dep:uuid"]
@@ -199,6 +190,9 @@ required-features = ["mbedtls"]
199190
[[example]]
200191
name = "server_method_callback"
201192

193+
[[example]]
194+
name = "server_random_port"
195+
202196
[[example]]
203197
name = "ssl_create_certificate"
204198
required-features = ["mbedtls", "x509"]

examples/server_random_port.rs

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
use std::thread;
2+
3+
use open62541::ServerBuilder;
4+
5+
fn main() {
6+
env_logger::init();
7+
8+
let (server, runner) = ServerBuilder::default()
9+
.server_urls(&["opc.tcp://127.0.0.1:0"])
10+
.build();
11+
12+
let handle = thread::spawn(|| runner.run_until_cancelled(&mut || true).unwrap());
13+
14+
if let Some(urls) = server.discovery_urls() {
15+
println!("Discovery URLs: {urls:?}");
16+
17+
if let Some(tail) = urls
18+
.as_slice()
19+
.first()
20+
.and_then(|url| url.as_str())
21+
.and_then(|url| url.strip_prefix("opc.tcp://127.0.0.1:"))
22+
{
23+
if let Ok(port) = tail.parse::<u16>() {
24+
println!("Server running on port {port}");
25+
} else {
26+
println!("Unable to find port");
27+
}
28+
}
29+
} else {
30+
println!("No discovery URLs");
31+
}
32+
33+
handle.join().unwrap();
34+
}

0 commit comments

Comments
 (0)