Skip to content

Instantly share code, notes, and snippets.

@JosiahParry
Created March 15, 2025 16:52
Show Gist options
  • Save JosiahParry/5bd31657691e738e8ec2de1661560784 to your computer and use it in GitHub Desktop.
Save JosiahParry/5bd31657691e738e8ec2de1661560784 to your computer and use it in GitHub Desktop.
Generate a random available user port in Rust
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