Add per-interface binding and poll backoff to discovery
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
24
sender.go
24
sender.go
@@ -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]
|
||||
|
||||
Reference in New Issue
Block a user