Fix syscalls on different archs
This commit is contained in:
+5
-5
@@ -145,7 +145,7 @@ func (b *Browser) ListenMulticastUDP() error {
|
|||||||
Control: func(network, address string, c syscall.RawConn) error {
|
Control: func(network, address string, c syscall.RawConn) error {
|
||||||
return c.Control(func(fd uintptr) {
|
return c.Control(func(fd uintptr) {
|
||||||
// 1. Allow multicast UDP to listen concurrently across multiple listeners
|
// 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 {
|
Control: func(network, address string, c syscall.RawConn) error {
|
||||||
return c.Control(func(fd uintptr) {
|
return c.Control(func(fd uintptr) {
|
||||||
// 1. Allow multicast UDP to listen concurrently across multiple listeners
|
// 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
|
// 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
|
// 3. Allow receive multicast responses on all this addresses
|
||||||
mreq := &syscall.IPMreq{
|
mreq := &syscall.IPMreq{
|
||||||
Multiaddr: [4]byte{224, 0, 0, 251},
|
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 {
|
for _, send := range b.Sends {
|
||||||
addr := send.LocalAddr().(*net.UDPAddr)
|
addr := send.LocalAddr().(*net.UDPAddr)
|
||||||
mreq.Interface = [4]byte(addr.IP.To4())
|
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)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -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)
|
||||||
|
}
|
||||||
@@ -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)
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user