diff --git a/client/src/nonblocking/udp_client.rs b/client/src/nonblocking/udp_client.rs index 46bd4ac5f0..7fc50e593c 100644 --- a/client/src/nonblocking/udp_client.rs +++ b/client/src/nonblocking/udp_client.rs @@ -19,8 +19,7 @@ pub struct UdpTpuConnection { impl UdpTpuConnection { pub fn new(tpu_addr: SocketAddr) -> Self { let socket = - solana_net_utils::bind_in_validator_port_range(IpAddr::V4(Ipv4Addr::new(0, 0, 0, 0))) - .unwrap(); + solana_net_utils::bind_with_any_port(IpAddr::V4(Ipv4Addr::new(0, 0, 0, 0))).unwrap(); socket.set_nonblocking(true).unwrap(); Self::new_with_std_socket(tpu_addr, socket) } @@ -104,8 +103,7 @@ mod tests { let addr_str = "0.0.0.0:50101"; let addr = addr_str.parse().unwrap(); let socket = - solana_net_utils::bind_in_validator_port_range(IpAddr::V4(Ipv4Addr::new(0, 0, 0, 0))) - .unwrap(); + solana_net_utils::bind_with_any_port(IpAddr::V4(Ipv4Addr::new(0, 0, 0, 0))).unwrap(); socket.set_nonblocking(true).unwrap(); let connection = UdpTpuConnection::new_with_std_socket(addr, socket); let reader = UdpSocket::bind(addr_str).await.expect("bind"); diff --git a/client/src/udp_client.rs b/client/src/udp_client.rs index acf5e41a06..24f256f304 100644 --- a/client/src/udp_client.rs +++ b/client/src/udp_client.rs @@ -20,8 +20,7 @@ pub struct UdpTpuConnection { impl UdpTpuConnection { pub fn new_from_addr(tpu_addr: SocketAddr) -> Self { let socket = - solana_net_utils::bind_in_validator_port_range(IpAddr::V4(Ipv4Addr::new(0, 0, 0, 0))) - .unwrap(); + solana_net_utils::bind_with_any_port(IpAddr::V4(Ipv4Addr::new(0, 0, 0, 0))).unwrap(); Self { socket, addr: tpu_addr, diff --git a/net-utils/src/lib.rs b/net-utils/src/lib.rs index 330fa22e47..9f60bb9b57 100644 --- a/net-utils/src/lib.rs +++ b/net-utils/src/lib.rs @@ -439,8 +439,16 @@ pub fn bind_in_range(ip_addr: IpAddr, range: PortRange) -> io::Result<(u16, UdpS )) } -pub fn bind_in_validator_port_range(ip_addr: IpAddr) -> io::Result { - bind_in_range(ip_addr, VALIDATOR_PORT_RANGE).map(|(_, socket)| socket) +pub fn bind_with_any_port(ip_addr: IpAddr) -> io::Result { + let sock = udp_socket(false)?; + let addr = SocketAddr::new(ip_addr, 0); + match sock.bind(&SockAddr::from(addr)) { + Ok(_) => Result::Ok(sock.into()), + Err(err) => Err(io::Error::new( + io::ErrorKind::Other, + format!("No available UDP port: {}", err), + )), + } } // binds many sockets to the same port in a range @@ -680,6 +688,17 @@ mod tests { } } + #[test] + fn test_bind_with_any_port() { + let ip_addr = IpAddr::V4(Ipv4Addr::new(0, 0, 0, 0)); + let x = bind_with_any_port(ip_addr).unwrap(); + let y = bind_with_any_port(ip_addr).unwrap(); + assert_ne!( + x.local_addr().unwrap().port(), + y.local_addr().unwrap().port() + ); + } + #[test] fn test_bind_in_range_nil() { let ip_addr = IpAddr::V4(Ipv4Addr::new(0, 0, 0, 0));