github.com/yaling888/clash@v1.53.0/component/dialer/bind_others.go (about) 1 //go:build !linux && !darwin && !windows 2 3 package dialer 4 5 import ( 6 "net" 7 "net/netip" 8 "strconv" 9 "syscall" 10 ) 11 12 func bindIfaceToDialer(ifaceName string, dialer *net.Dialer, network string, destination netip.Addr) error { 13 if !destination.IsGlobalUnicast() { 14 return nil 15 } 16 17 local := uint64(0) 18 if dialer.LocalAddr != nil { 19 _, port, err := net.SplitHostPort(dialer.LocalAddr.String()) 20 if err == nil { 21 local, _ = strconv.ParseUint(port, 10, 16) 22 } 23 } 24 25 addr, err := lookupLocalAddr(ifaceName, network, destination, int(local)) 26 if err != nil { 27 return err 28 } 29 30 dialer.LocalAddr = addr 31 32 return nil 33 } 34 35 func bindIfaceToListenConfig(ifaceName string, _ *net.ListenConfig, network, address string) (string, error) { 36 _, port, err := net.SplitHostPort(address) 37 if err != nil { 38 port = "0" 39 } 40 41 local, _ := strconv.ParseUint(port, 10, 16) 42 43 addr, err := lookupLocalAddr(ifaceName, network, netip.Addr{}, int(local)) 44 if err != nil { 45 return "", err 46 } 47 48 return addr.String(), nil 49 } 50 51 func WithBindToInterfaceControlFn(_ string) func(network, address string, c syscall.RawConn) (err error) { 52 return nil 53 }