WSL needs ReuseAddr in addition to ReusePort (which it doesn't honor) (#1149)
This commit is contained in:
		@@ -3,7 +3,7 @@
 | 
				
			|||||||
extern crate reqwest;
 | 
					extern crate reqwest;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
use nix::sys::socket::setsockopt;
 | 
					use nix::sys::socket::setsockopt;
 | 
				
			||||||
use nix::sys::socket::sockopt::ReusePort;
 | 
					use nix::sys::socket::sockopt::{ReuseAddr, ReusePort};
 | 
				
			||||||
use pnet_datalink as datalink;
 | 
					use pnet_datalink as datalink;
 | 
				
			||||||
use rand::{thread_rng, Rng};
 | 
					use rand::{thread_rng, Rng};
 | 
				
			||||||
use socket2::{Domain, SockAddr, Socket, Type};
 | 
					use socket2::{Domain, SockAddr, Socket, Type};
 | 
				
			||||||
@@ -79,6 +79,7 @@ pub fn bind_in_range(range: (u16, u16)) -> io::Result<UdpSocket> {
 | 
				
			|||||||
    let sock = Socket::new(Domain::ipv4(), Type::dgram(), None).unwrap();
 | 
					    let sock = Socket::new(Domain::ipv4(), Type::dgram(), None).unwrap();
 | 
				
			||||||
    let sock_fd = sock.as_raw_fd();
 | 
					    let sock_fd = sock.as_raw_fd();
 | 
				
			||||||
    setsockopt(sock_fd, ReusePort, &true).unwrap();
 | 
					    setsockopt(sock_fd, ReusePort, &true).unwrap();
 | 
				
			||||||
 | 
					    setsockopt(sock_fd, ReuseAddr, &true).unwrap();
 | 
				
			||||||
    loop {
 | 
					    loop {
 | 
				
			||||||
        let rand_port = thread_rng().gen_range(start, end);
 | 
					        let rand_port = thread_rng().gen_range(start, end);
 | 
				
			||||||
        let addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(0, 0, 0, 0)), rand_port);
 | 
					        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 = Socket::new(Domain::ipv4(), Type::dgram(), None).unwrap();
 | 
				
			||||||
    let sock_fd = sock.as_raw_fd();
 | 
					    let sock_fd = sock.as_raw_fd();
 | 
				
			||||||
    setsockopt(sock_fd, ReusePort, &true).unwrap();
 | 
					    setsockopt(sock_fd, ReusePort, &true).unwrap();
 | 
				
			||||||
 | 
					    setsockopt(sock_fd, ReuseAddr, &true).unwrap();
 | 
				
			||||||
    let addr = socketaddr!(0, port);
 | 
					    let addr = socketaddr!(0, port);
 | 
				
			||||||
    match sock.bind(&SockAddr::from(addr)) {
 | 
					    match sock.bind(&SockAddr::from(addr)) {
 | 
				
			||||||
        Ok(_) => sock.into_udp_socket(),
 | 
					        Ok(_) => sock.into_udp_socket(),
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user