use std::{io, net::SocketAddr};
use socket2::{Domain, Protocol, Socket, Type};
pub fn bind_reuseport(
addr: SocketAddr,
backlog: i32,
incoming_cpu: Option<usize>,
) -> io::Result<std::net::TcpListener> {
let socket = Socket::new(Domain::for_address(addr), Type::STREAM, Some(Protocol::TCP))?;
socket.set_reuse_address(true)?;
socket.set_reuse_port(true)?;
if let Some(cpu) = incoming_cpu {
set_incoming_cpu(&socket, cpu);
}
socket.bind(&addr.into())?;
socket.listen(backlog)?;
Ok(socket.into())
}
#[cfg(target_os = "linux")]
fn set_incoming_cpu(socket: &Socket, cpu: usize) {
let _ = socket.set_cpu_affinity(cpu);
}
#[cfg(not(target_os = "linux"))]
fn set_incoming_cpu(_socket: &Socket, _cpu: usize) {}