From 34f1a87dc7c955b53905bb03c599897b0d3ae3e8 Mon Sep 17 00:00:00 2001 From: xqzr <34030394+xqzr@users.noreply.github.com> Date: Fri, 4 Apr 2025 04:53:38 +0800 Subject: [PATCH 1/2] Sockopt: Fix Windows `IPV6_MULTICAST_IF` & `IP_MULTICAST_IF` on Unicast --- transport/internet/sockopt_windows.go | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/transport/internet/sockopt_windows.go b/transport/internet/sockopt_windows.go index dd3f0390fb4d..f924c94795dd 100644 --- a/transport/internet/sockopt_windows.go +++ b/transport/internet/sockopt_windows.go @@ -44,6 +44,7 @@ func applyOutboundSocketOptions(network string, address string, fd uintptr, conf isV4 := strings.Contains(address, ".") // note: DO NOT trust the passed network variable, it can be udp6 even if the address is ipv4 // because operating system might(always) use ipv6 socket to process ipv4 + host, _, err := net.SplitHostPort(address) if isV4 { var bytes [4]byte binary.BigEndian.PutUint32(bytes[:], uint32(inf.Index)) @@ -51,15 +52,19 @@ func applyOutboundSocketOptions(network string, address string, fd uintptr, conf if err := syscall.SetsockoptInt(syscall.Handle(fd), syscall.IPPROTO_IP, IP_UNICAST_IF, int(idx)); err != nil { return errors.New("failed to set IP_UNICAST_IF").Base(err) } - if err := syscall.SetsockoptInt(syscall.Handle(fd), syscall.IPPROTO_IP, IP_MULTICAST_IF, int(idx)); err != nil { - return errors.New("failed to set IP_MULTICAST_IF").Base(err) + if ip := net.ParseIP(host); ip != nil && ip.IsMulticast() { + if err := syscall.SetsockoptInt(syscall.Handle(fd), syscall.IPPROTO_IP, IP_MULTICAST_IF, int(idx)); err != nil { + return errors.New("failed to set IP_MULTICAST_IF").Base(err) + } } } else { if err := syscall.SetsockoptInt(syscall.Handle(fd), syscall.IPPROTO_IPV6, IPV6_UNICAST_IF, inf.Index); err != nil { return errors.New("failed to set IPV6_UNICAST_IF").Base(err) } - if err := syscall.SetsockoptInt(syscall.Handle(fd), syscall.IPPROTO_IPV6, IPV6_MULTICAST_IF, inf.Index); err != nil { - return errors.New("failed to set IPV6_MULTICAST_IF").Base(err) + if ip := net.ParseIP(host); ip != nil && ip.IsMulticast() { + if err := syscall.SetsockoptInt(syscall.Handle(fd), syscall.IPPROTO_IPV6, IPV6_MULTICAST_IF, inf.Index); err != nil { + return errors.New("failed to set IPV6_MULTICAST_IF").Base(err) + } } } } From 663266e9273f95383e3f877fb60e501161cd3c52 Mon Sep 17 00:00:00 2001 From: xqzr <34030394+xqzr@users.noreply.github.com> Date: Fri, 4 Apr 2025 05:27:13 +0800 Subject: [PATCH 2/2] on TCP --- transport/internet/sockopt_windows.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/transport/internet/sockopt_windows.go b/transport/internet/sockopt_windows.go index f924c94795dd..938adafcffe7 100644 --- a/transport/internet/sockopt_windows.go +++ b/transport/internet/sockopt_windows.go @@ -52,7 +52,7 @@ func applyOutboundSocketOptions(network string, address string, fd uintptr, conf if err := syscall.SetsockoptInt(syscall.Handle(fd), syscall.IPPROTO_IP, IP_UNICAST_IF, int(idx)); err != nil { return errors.New("failed to set IP_UNICAST_IF").Base(err) } - if ip := net.ParseIP(host); ip != nil && ip.IsMulticast() { + if ip := net.ParseIP(host); ip != nil && ip.IsMulticast() && isUDPSocket(network) { if err := syscall.SetsockoptInt(syscall.Handle(fd), syscall.IPPROTO_IP, IP_MULTICAST_IF, int(idx)); err != nil { return errors.New("failed to set IP_MULTICAST_IF").Base(err) } @@ -61,7 +61,7 @@ func applyOutboundSocketOptions(network string, address string, fd uintptr, conf if err := syscall.SetsockoptInt(syscall.Handle(fd), syscall.IPPROTO_IPV6, IPV6_UNICAST_IF, inf.Index); err != nil { return errors.New("failed to set IPV6_UNICAST_IF").Base(err) } - if ip := net.ParseIP(host); ip != nil && ip.IsMulticast() { + if ip := net.ParseIP(host); ip != nil && ip.IsMulticast() && isUDPSocket(network) { if err := syscall.SetsockoptInt(syscall.Handle(fd), syscall.IPPROTO_IPV6, IPV6_MULTICAST_IF, inf.Index); err != nil { return errors.New("failed to set IPV6_MULTICAST_IF").Base(err) }