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,8 +1,10 @@
package artnet
import (
"context"
"net"
"sync"
"syscall"
)
type Sender struct {
@@ -30,6 +32,28 @@ func NewSenderFromConn(conn *net.UDPConn) *Sender {
}
}
func NewInterfaceSender(ifaceName string) (*Sender, 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", ":0")
if err != nil {
return nil, err
}
return &Sender{
conn: conn.(*net.UDPConn),
sequences: map[Universe]uint8{},
}, nil
}
func (s *Sender) SendDMX(addr *net.UDPAddr, universe Universe, data []byte) error {
s.seqMu.Lock()
seq := s.sequences[universe]