blob: 727a648ba45ddb20d32e9903731b211f44789356 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
use std::net::SocketAddr;
use tokio::net::UdpSocket;
use crate::Error;
pub async fn create_remote_socket(
ipv4: bool,
#[cfg(target_os = "linux")] fwmark: Option<u32>,
) -> Result<UdpSocket, Error> {
let random_bind_addr = if ipv4 {
SocketAddr::new("0.0.0.0".parse().unwrap(), 0)
} else {
SocketAddr::new("::".parse().unwrap(), 0)
};
let socket = UdpSocket::bind(random_bind_addr)
.await
.map_err(Error::BindRemoteUdp)?;
#[cfg(target_os = "linux")]
if let Some(fwmark) = fwmark {
use nix::sys::socket::{setsockopt, sockopt};
setsockopt(&socket, sockopt::Mark, &fwmark).map_err(Error::SetFwmark)?;
}
Ok(socket)
}
|