diff --git a/pkg/mdns/mdns.go b/pkg/mdns/mdns.go index 463a82b0..c4f96cef 100644 --- a/pkg/mdns/mdns.go +++ b/pkg/mdns/mdns.go @@ -145,7 +145,7 @@ func (b *Browser) ListenMulticastUDP() error { Control: func(network, address string, c syscall.RawConn) error { return c.Control(func(fd uintptr) { // 1. Allow multicast UDP to listen concurrently across multiple listeners - _ = syscall.SetsockoptInt(syscall.Handle(fd), syscall.SOL_SOCKET, syscall.SO_REUSEADDR, 1) + _ = SetsockoptInt(fd, syscall.SOL_SOCKET, syscall.SO_REUSEADDR, 1) }) }, } @@ -167,21 +167,21 @@ func (b *Browser) ListenMulticastUDP() error { Control: func(network, address string, c syscall.RawConn) error { return c.Control(func(fd uintptr) { // 1. Allow multicast UDP to listen concurrently across multiple listeners - _ = syscall.SetsockoptInt(syscall.Handle(fd), syscall.SOL_SOCKET, syscall.SO_REUSEADDR, 1) + _ = SetsockoptInt(fd, syscall.SOL_SOCKET, syscall.SO_REUSEADDR, 1) // 2. Disable loop responses - _ = syscall.SetsockoptInt(syscall.Handle(fd), syscall.IPPROTO_IP, syscall.IP_MULTICAST_LOOP, 0) + _ = SetsockoptInt(fd, syscall.IPPROTO_IP, syscall.IP_MULTICAST_LOOP, 0) // 3. Allow receive multicast responses on all this addresses mreq := &syscall.IPMreq{ Multiaddr: [4]byte{224, 0, 0, 251}, } - _ = syscall.SetsockoptIPMreq(syscall.Handle(fd), syscall.IPPROTO_IP, syscall.IP_ADD_MEMBERSHIP, mreq) + _ = SetsockoptIPMreq(fd, syscall.IPPROTO_IP, syscall.IP_ADD_MEMBERSHIP, mreq) for _, send := range b.Sends { addr := send.LocalAddr().(*net.UDPAddr) mreq.Interface = [4]byte(addr.IP.To4()) - _ = syscall.SetsockoptIPMreq(syscall.Handle(fd), syscall.IPPROTO_IP, syscall.IP_ADD_MEMBERSHIP, mreq) + _ = SetsockoptIPMreq(fd, syscall.IPPROTO_IP, syscall.IP_ADD_MEMBERSHIP, mreq) } }) }, diff --git a/pkg/mdns/syscall.go b/pkg/mdns/syscall.go new file mode 100644 index 00000000..f678b684 --- /dev/null +++ b/pkg/mdns/syscall.go @@ -0,0 +1,13 @@ +//go:build darwin || linux + +package mdns + +import "syscall" + +func SetsockoptInt(fd uintptr, level, opt int, value int) (err error) { + return syscall.SetsockoptInt(int(fd), level, opt, value) +} + +func SetsockoptIPMreq(fd uintptr, level, opt int, mreq *syscall.IPMreq) (err error) { + return syscall.SetsockoptIPMreq(int(fd), level, opt, mreq) +} diff --git a/pkg/mdns/syscall_windows.go b/pkg/mdns/syscall_windows.go new file mode 100644 index 00000000..be283655 --- /dev/null +++ b/pkg/mdns/syscall_windows.go @@ -0,0 +1,11 @@ +package mdns + +import "syscall" + +func SetsockoptInt(fd uintptr, level, opt int, value int) (err error) { + return syscall.SetsockoptInt(syscall.Handle(fd), level, opt, value) +} + +func SetsockoptIPMreq(fd uintptr, level, opt int, mreq *syscall.IPMreq) (err error) { + return syscall.SetsockoptIPMreq(syscall.Handle(fd), level, opt, mreq) +}