shadowsocks/shadowsocks-rust · error
udp datagram requires IP address target
Error message
udp datagram requires IP address target
What it means
ManagerServerSendTo::send_to was called on a UDP-datagram manager socket with a ManagerSocketAddr::UnixSocketAddr target. UDP sockets can only send to IP:port addresses, so the method refuses the call with ErrorKind::InvalidInput instead of attempting an impossible send.
Solutions
- Use a SocketAddr (IP:port) target when the manager transport is UDP
- Switch the manager transport to unix datagram if the manager listens on a unix socket path
- Validate the ManagerAddr type before choosing which transport/datagram to build
Example fix
// before
udp_conn.send_to(buf, &ManagerSocketAddr::UnixSocketAddr(path)).await?;
// after
let target = ManagerSocketAddr::SocketAddr("127.0.0.1:6010".parse()?);
udp_conn.send_to(buf, &target).await?; Defensive patterns
Strategy: validation
Validate before calling
if let ManagerSocketAddr::UnixSocketAddr(_) = target {
return Err(anyhow!("UDP transport cannot send to unix socket target"));
} Prevention
- Keep manager address type and transport type consistent in config
- Use UDP transports only with IP:port manager addresses
- Unit-test transport/address combinations at startup
When it happens
Trigger: Calling send_to on a manager connection opened over UDP (ManagerDatagram::UdpDatagram) while passing a target created from a unix socket path (e.g. /path/to/manager.sock).
Common situations: Configuration where the manager address and the transport are mismatched — the client connects to the manager over UDP but the config specifies a unix-socket address, or code copied from the unix-socket variant is reused with a UDP transport.
Understand the failure class
Background: "Must be a positive integer", "Invalid value", "Unsupported": the invalid-argument-value error family, when a library rejects the value you pass — this error's family across 35 libraries.
Related errors
- target address must not be unnamed
- unix datagram requires path address target
- AES-128 init
- AES-256 init
- balancer.max_server_rtt must be > 0
AI-assisted analysis of shadowsocks/shadowsocks-rust@8eb0f0a65b (2026-09-09).
Data as JSON: /api/errors/1a45b54270f77211.
Report an issue: GitHub.
Appendix: source
Thrown at crates/shadowsocks/src/manager/datagram.rs:148
}
/// Sends data to the socket
pub async fn send(&mut self, buf: &[u8]) -> io::Result<usize> {
match *self {
Self::UdpDatagram(ref mut udp) => udp.send(buf).await,
#[cfg(unix)]
Self::UnixDatagram(ref mut unix) => unix.send(buf).await,
}
}
/// Sends data to the socket to the specified address.
pub async fn send_to(&mut self, buf: &[u8], target: &ManagerSocketAddr) -> io::Result<usize> {
match *self {
Self::UdpDatagram(ref mut udp) => match *target {
ManagerSocketAddr::SocketAddr(ref saddr) => udp.send_to(buf, saddr).await,
#[cfg(unix)]
ManagerSocketAddr::UnixSocketAddr(..) => {
let err = io::Error::new(ErrorKind::InvalidInput, "udp datagram requires IP address target");
Err(err)
}
},
#[cfg(unix)]
Self::UnixDatagram(ref mut unix) => match *target {
ManagerSocketAddr::UnixSocketAddr(ref saddr) => match saddr.as_pathname() {
Some(paddr) => unix.send_to(buf, paddr).await,
None => {
let err = io::Error::new(ErrorKind::InvalidInput, "target address must not be unnamed");
Err(err)
}
},
ManagerSocketAddr::SocketAddr(..) => {
let err = io::Error::new(ErrorKind::InvalidInput, "unix datagram requires path address target");
Err(err)
}
},
}View on GitHub (pinned to 8eb0f0a65b)