github.com/kelleygo/clashcore@v1.0.2/component/dhcp/conn.go (about) 1 package dhcp 2 3 import ( 4 "context" 5 "net" 6 "net/netip" 7 "runtime" 8 9 "github.com/kelleygo/clashcore/component/dialer" 10 ) 11 12 func ListenDHCPClient(ctx context.Context, ifaceName string) (net.PacketConn, error) { 13 listenAddr := "0.0.0.0:68" 14 if runtime.GOOS == "linux" || runtime.GOOS == "android" { 15 listenAddr = "255.255.255.255:68" 16 } 17 18 options := []dialer.Option{ 19 dialer.WithInterface(ifaceName), 20 dialer.WithAddrReuse(true), 21 } 22 23 // fallback bind on windows, because syscall bind can not receive broadcast 24 if runtime.GOOS == "windows" { 25 options = append(options, dialer.WithFallbackBind(true)) 26 } 27 28 return dialer.ListenPacket(ctx, "udp4", listenAddr, netip.AddrPortFrom(netip.AddrFrom4([4]byte{255, 255, 255, 255}), 67), options...) 29 }