Files
noq/perf/src/lib.rs
T
Matthias Einwag 2870519f6e perf: Use dual stack socket for endpoints
Users found it rather confusing that binding to the default address
(::0) doesn't allow incoming connections via IPv4 on windows.
This change will allow for this, by using a IPv6 socket and
disabling IPv6-only on all platforms. This lets the windows and unix
implementations behave equally.
2021-03-08 06:38:34 +01:00

54 lines
1.4 KiB
Rust

use std::net::SocketAddr;
use anyhow::{Context, Result};
use socket2::{Domain, Protocol, Socket, Type};
use tracing::warn;
pub fn bind_socket(
addr: SocketAddr,
send_buffer_size: usize,
recv_buffer_size: usize,
) -> Result<std::net::UdpSocket> {
let socket = Socket::new(
match addr.is_ipv4() {
true => Domain::ipv4(),
false => Domain::ipv6(),
},
Type::dgram(),
Some(Protocol::udp()),
)
.context("create socket")?;
if addr.is_ipv6() {
socket.set_only_v6(false).context("set_only_v6")?;
}
socket
.bind(&socket2::SockAddr::from(addr))
.context("binding endpoint")?;
socket
.set_send_buffer_size(send_buffer_size)
.context("send buffer size")?;
socket
.set_recv_buffer_size(recv_buffer_size)
.context("recv buffer size")?;
let buf_size = socket.send_buffer_size().context("send buffer size")?;
if buf_size < send_buffer_size {
warn!(
"Unable to set desired send buffer size. Desired: {}, Actual: {}",
send_buffer_size, buf_size
);
}
let buf_size = socket.recv_buffer_size().context("recv buffer size")?;
if buf_size < recv_buffer_size {
warn!(
"Unable to set desired recv buffer size. Desired: {}, Actual: {}",
recv_buffer_size, buf_size
);
}
Ok(socket.into())
}