Merge pull request #85 from tikue/master

Make port reusable
This commit is contained in:
Adam Wright
2017-01-30 22:46:29 -08:00
committed by GitHub
2 changed files with 24 additions and 7 deletions

View File

@@ -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 {

View File

@@ -102,14 +102,20 @@ fn listen_with<S, Req, Resp, E>(new_service: S,
fn listener(addr: &SocketAddr, handle: &Handle) -> io::Result<TcpListener> {
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))
}