Skip to content

Commit 366a932

Browse files
committed
fix(shadowsocks): Windows UDP outbound socket set IF before bind()
ref #1266
1 parent 42157f7 commit 366a932

File tree

1 file changed

+14
-12
lines changed
  • crates/shadowsocks/src/net/sys/windows

1 file changed

+14
-12
lines changed

crates/shadowsocks/src/net/sys/windows/mod.rs

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ use std::{
1616
use bytes::BytesMut;
1717
use log::{error, warn};
1818
use pin_project::pin_project;
19-
use socket2::{Domain, Protocol, Socket, TcpKeepalive, Type};
19+
use socket2::{Domain, Protocol, SockAddr, Socket, TcpKeepalive, Type};
2020
use tokio::{
2121
io::{AsyncRead, AsyncWrite, ReadBuf},
2222
net::{TcpSocket, TcpStream as TokioTcpStream, UdpSocket},
@@ -467,26 +467,28 @@ pub async fn create_outbound_udp_socket(af: AddrFamily, opts: &ConnectOpts) -> i
467467
pub async fn bind_outbound_udp_socket(bind_addr: &SocketAddr, opts: &ConnectOpts) -> io::Result<UdpSocket> {
468468
let af = AddrFamily::from(bind_addr);
469469

470-
let socket = if af != AddrFamily::Ipv6 {
471-
UdpSocket::bind(bind_addr).await?
470+
let socket = Socket::new(Domain::for_address(*bind_addr), Type::DGRAM, Some(Protocol::UDP))?;
471+
472+
if let Some(ref iface) = opts.bind_interface {
473+
set_ip_unicast_if(&socket, bind_addr, iface)?;
474+
}
475+
476+
// bind() should be called after IP_UNICAST_IF
477+
if af != AddrFamily::Ipv6 {
478+
let bind_addr = SockAddr::from(*bind_addr);
479+
socket.bind(&bind_addr)?;
472480
} else {
473-
let socket = Socket::new(Domain::for_address(*bind_addr), Type::DGRAM, Some(Protocol::UDP))?;
474481
socket_bind_dual_stack(&socket, bind_addr, false)?;
482+
}
475483

476-
// UdpSocket::from_std requires socket to be non-blocked
477-
socket.set_nonblocking(true)?;
478-
UdpSocket::from_std(socket.into())?
479-
};
484+
socket.set_nonblocking(true)?;
485+
let socket = UdpSocket::from_std(socket.into())?;
480486

481487
if let Err(err) = set_disable_ip_fragmentation(af, &socket) {
482488
warn!("failed to disable IP fragmentation, error: {}", err);
483489
}
484490
disable_connection_reset(&socket)?;
485491

486-
if let Some(ref iface) = opts.bind_interface {
487-
set_ip_unicast_if(&socket, bind_addr, iface)?;
488-
}
489-
490492
Ok(socket)
491493
}
492494

0 commit comments

Comments
 (0)