Add per-interface binding and poll backoff to discovery

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
Ian Gulliver
2026-01-30 09:13:57 -08:00
parent 5e7400fe51
commit 17ab11b048
3 changed files with 65 additions and 69 deletions

View File

@@ -1,7 +1,9 @@
package artnet
import (
"context"
"net"
"syscall"
"time"
)
@@ -34,6 +36,29 @@ func NewDefaultReceiver(handler Handler) (*Receiver, error) {
return NewReceiver(&net.UDPAddr{Port: Port}, handler)
}
func NewInterfaceReceiver(ifaceName string, handler Handler) (*Receiver, error) {
lc := net.ListenConfig{
Control: func(network, address string, c syscall.RawConn) error {
var err error
c.Control(func(fd uintptr) {
err = syscall.SetsockoptString(int(fd), syscall.SOL_SOCKET, syscall.SO_BINDTODEVICE, ifaceName)
})
return err
},
}
conn, err := lc.ListenPacket(context.Background(), "udp4", ":6454")
if err != nil {
return nil, err
}
return &Receiver{
conn: conn.(*net.UDPConn),
handler: handler,
done: make(chan struct{}),
}, nil
}
func (r *Receiver) Start() {
go r.loop()
}