diff --git a/src/macros.rs b/src/macros.rs index d832001..4207bd8 100644 --- a/src/macros.rs +++ b/src/macros.rs @@ -822,6 +822,17 @@ mod functional_test { bad => panic!(r#"Expected Error::ServerDeserialize but got "{}""#, bad), } } + + #[test] + fn reuse_addr() { + let _ = env_logger::init(); + let addr = Server.listen("localhost:0".first_socket_addr(), server::Options::default()) + .wait() + .unwrap(); + Server.listen(addr, server::Options::default()) + .wait() + .unwrap(); + } } pub mod error_service { diff --git a/src/server.rs b/src/server.rs index 8f1248d..5fb8fd7 100644 --- a/src/server.rs +++ b/src/server.rs @@ -102,14 +102,20 @@ fn listen_with(new_service: S, fn listener(addr: &SocketAddr, handle: &Handle) -> io::Result { const PENDING_CONNECTION_BACKLOG: i32 = 1024; + #[cfg(unix)] + use net2::unix::UnixTcpBuilderExt; - match *addr { - SocketAddr::V4(_) => net2::TcpBuilder::new_v4(), - SocketAddr::V6(_) => net2::TcpBuilder::new_v6(), - } - ? - .reuse_address(true)? - .bind(addr)? + let builder = match *addr { + SocketAddr::V4(_) => net2::TcpBuilder::new_v4(), + SocketAddr::V6(_) => net2::TcpBuilder::new_v6(), + }?; + + builder.reuse_address(true)?; + + #[cfg(unix)] + builder.reuse_port(true)?; + + builder.bind(addr)? .listen(PENDING_CONNECTION_BACKLOG) .and_then(|l| TcpListener::from_listener(l, addr, handle)) }