Created
March 15, 2025 16:52
-
-
Save JosiahParry/5bd31657691e738e8ec2de1661560784 to your computer and use it in GitHub Desktop.
Generate a random available user port in Rust
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
use rand::{rng, seq::SliceRandom}; | |
use std::{ | |
io::Result, | |
net::{IpAddr, SocketAddr, TcpListener, ToSocketAddrs}, | |
vec::IntoIter, | |
}; | |
pub struct RandomUserPort(std::ops::RangeInclusive<u16>); | |
impl RandomUserPort { | |
pub fn new() -> Self { | |
RandomUserPort(1024..=49151) | |
} | |
pub fn find_port() -> Result<u16> { | |
let res = TcpListener::bind(Self::new())?; | |
Ok(res.local_addr()?.port()) | |
} | |
} | |
impl ToSocketAddrs for RandomUserPort { | |
type Iter = IntoIter<SocketAddr>; | |
fn to_socket_addrs(&self) -> Result<Self::Iter> { | |
// You might want to use localhost (127.0.0.1) as default IP | |
let ip = IpAddr::from([127, 0, 0, 1]); | |
// Convert the range into a vector of SocketAddr | |
let mut addrs = self | |
.0 | |
.clone() | |
.map(|port| SocketAddr::new(ip, port)) | |
.collect::<Vec<_>>(); | |
let mut rng = rng(); | |
addrs.shuffle(&mut rng); | |
Ok(addrs.into_iter()) | |
} | |
} | |
fn main() { | |
println!("First open port: {:?}", RandomUserPort::find_port()) | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment