diff --git a/transport/internet/sockopt_windows.go b/transport/internet/sockopt_windows.go index f1d4ba2b..dd3f0390 100644 --- a/transport/internet/sockopt_windows.go +++ b/transport/internet/sockopt_windows.go @@ -40,7 +40,10 @@ func applyOutboundSocketOptions(network string, address string, fd uintptr, conf if err != nil { return errors.New("failed to find the interface").Base(err) } - isV4 := (network == "tcp4" || network == "udp4") + // easy way to check if the address is ipv4 + 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 if isV4 { var bytes [4]byte binary.BigEndian.PutUint32(bytes[:], uint32(inf.Index)) diff --git a/transport/internet/system_dialer.go b/transport/internet/system_dialer.go index 63365099..658382f7 100644 --- a/transport/internet/system_dialer.go +++ b/transport/internet/system_dialer.go @@ -63,7 +63,7 @@ func (d *DefaultSystemDialer) Dial(ctx context.Context, src net.Address, dest ne lc.Control = func(network, address string, c syscall.RawConn) error { return c.Control(func(fd uintptr) { if sockopt != nil { - if err := applyOutboundSocketOptions(network, "", fd, sockopt); err != nil { + if err := applyOutboundSocketOptions(network, dest.NetAddr(), fd, sockopt); err != nil { errors.LogInfo(ctx, err, "failed to apply socket options") } }