Bind interface for sACN receiver multicast group joins

This commit is contained in:
Ian Gulliver
2026-01-28 20:00:59 -08:00
parent f33ba514a7
commit 2b833d7913
2 changed files with 13 additions and 10 deletions

View File

@@ -158,7 +158,7 @@ func main() {
// Create sACN receiver if needed // Create sACN receiver if needed
sacnUniverses := cfg.SACNSourceUniverses() sacnUniverses := cfg.SACNSourceUniverses()
if len(sacnUniverses) > 0 { if len(sacnUniverses) > 0 {
sacnReceiver, err := sacn.NewReceiver(sacnUniverses, app.HandleSACN) sacnReceiver, err := sacn.NewReceiver(sacnUniverses, *sacnInterface, app.HandleSACN)
if err != nil { if err != nil {
log.Fatalf("sacn receiver error: %v", err) log.Fatalf("sacn receiver error: %v", err)
} }

View File

@@ -20,25 +20,28 @@ type Receiver struct {
} }
// NewReceiver creates a new sACN receiver for the given universes // NewReceiver creates a new sACN receiver for the given universes
func NewReceiver(universes []uint16, handler DMXHandler) (*Receiver, error) { func NewReceiver(universes []uint16, ifaceName string, handler DMXHandler) (*Receiver, error) {
// Listen on sACN port
c, err := net.ListenPacket("udp4", ":5568") c, err := net.ListenPacket("udp4", ":5568")
if err != nil { if err != nil {
return nil, err return nil, err
} }
var iface *net.Interface
if ifaceName != "" {
iface, err = net.InterfaceByName(ifaceName)
if err != nil {
c.Close()
return nil, err
}
}
p := ipv4.NewPacketConn(c) p := ipv4.NewPacketConn(c)
// Join multicast groups for each universe
for _, u := range universes { for _, u := range universes {
group := net.IPv4(239, 255, byte(u>>8), byte(u&0xff)) group := net.IPv4(239, 255, byte(u>>8), byte(u&0xff))
iface, _ := net.InterfaceByIndex(0) // Use default interface
if err := p.JoinGroup(iface, &net.UDPAddr{IP: group}); err != nil { if err := p.JoinGroup(iface, &net.UDPAddr{IP: group}); err != nil {
// Try joining on all interfaces c.Close()
ifaces, _ := net.Interfaces() return nil, err
for _, iface := range ifaces {
p.JoinGroup(&iface, &net.UDPAddr{IP: group})
}
} }
} }