shell_scene/util/
net.rs

1use crate::util::eprintln_err;
2use std::net::{TcpListener, TcpStream};
3use std::thread;
4use std::time::Duration;
5
6pub fn find_free_port(start: u16) -> u16 {
7    let first = if start == 0 { 1 } else { start };
8    let mut p = first;
9    loop {
10        match TcpListener::bind(("127.0.0.1", p)) {
11            Ok(listener) => {
12                drop(listener);
13                return p;
14            }
15            Err(_) => {
16                p = p.wrapping_add(1);
17                if p == 0 {
18                    p = 1;
19                }
20                if p == first {
21                    eprintln_err("No free TCP port found in range 1..=65535.");
22                    std::process::exit(1);
23                }
24            }
25        }
26    }
27}
28
29pub fn wait_for_tcp(host: &str, port: u16, attempts: usize, sleep_ms: u64) {
30    for _ in 0..attempts {
31        if TcpStream::connect((host, port)).is_ok() {
32            return;
33        }
34        thread::sleep(Duration::from_millis(sleep_ms));
35    }
36}