WSL needs ReuseAddr in addition to ReusePort (which it doesn't honor) (#1149)

This commit is contained in:
Rob Walker 2018-09-08 07:28:22 +09:00 committed by GitHub
parent 51b27779c9
commit bf29590f41
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 3 additions and 1 deletions

View File

@ -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<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();
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(),