mirror of
https://github.com/n0-computer/noq.git
synced 2026-09-23 11:45:25 +00:00
2870519f6e
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.
54 lines
1.4 KiB
Rust
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())
|
|
}
|