From bf29590f411c892a40d48053ddcd9abd09c15bf9 Mon Sep 17 00:00:00 2001 From: Rob Walker Date: Sat, 8 Sep 2018 07:28:22 +0900 Subject: [PATCH] WSL needs ReuseAddr in addition to ReusePort (which it doesn't honor) (#1149) --- src/nat.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/nat.rs b/src/nat.rs index fd2ac6ff7a..5c10671ed0 100644 --- a/src/nat.rs +++ b/src/nat.rs @@ -3,7 +3,7 @@ extern crate reqwest; use nix::sys::socket::setsockopt; -use nix::sys::socket::sockopt::ReusePort; +use nix::sys::socket::sockopt::{ReuseAddr, ReusePort}; use pnet_datalink as datalink; use rand::{thread_rng, Rng}; use socket2::{Domain, SockAddr, Socket, Type}; @@ -79,6 +79,7 @@ pub fn bind_in_range(range: (u16, u16)) -> io::Result { let sock = Socket::new(Domain::ipv4(), Type::dgram(), None).unwrap(); let sock_fd = sock.as_raw_fd(); setsockopt(sock_fd, ReusePort, &true).unwrap(); + setsockopt(sock_fd, ReuseAddr, &true).unwrap(); loop { let rand_port = thread_rng().gen_range(start, end); let addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(0, 0, 0, 0)), rand_port); @@ -97,6 +98,7 @@ pub fn bind_to(port: u16) -> UdpSocket { let sock = Socket::new(Domain::ipv4(), Type::dgram(), None).unwrap(); let sock_fd = sock.as_raw_fd(); setsockopt(sock_fd, ReusePort, &true).unwrap(); + setsockopt(sock_fd, ReuseAddr, &true).unwrap(); let addr = socketaddr!(0, port); match sock.bind(&SockAddr::from(addr)) { Ok(_) => sock.into_udp_socket(),