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  }