From 2b833d7913f4f5381d519ebd9a39474ad9514427 Mon Sep 17 00:00:00 2001 From: Ian Gulliver Date: Wed, 28 Jan 2026 20:00:59 -0800 Subject: [PATCH] Bind interface for sACN receiver multicast group joins --- main.go | 2 +- sacn/receiver.go | 21 ++++++++++++--------- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/main.go b/main.go index 0db69c4..c3387e0 100644 --- a/main.go +++ b/main.go @@ -158,7 +158,7 @@ func main() { // Create sACN receiver if needed sacnUniverses := cfg.SACNSourceUniverses() if len(sacnUniverses) > 0 { - sacnReceiver, err := sacn.NewReceiver(sacnUniverses, app.HandleSACN) + sacnReceiver, err := sacn.NewReceiver(sacnUniverses, *sacnInterface, app.HandleSACN) if err != nil { log.Fatalf("sacn receiver error: %v", err) } diff --git a/sacn/receiver.go b/sacn/receiver.go index bdbed09..99c06ac 100644 --- a/sacn/receiver.go +++ b/sacn/receiver.go @@ -20,25 +20,28 @@ type Receiver struct { } // NewReceiver creates a new sACN receiver for the given universes -func NewReceiver(universes []uint16, handler DMXHandler) (*Receiver, error) { - // Listen on sACN port +func NewReceiver(universes []uint16, ifaceName string, handler DMXHandler) (*Receiver, error) { c, err := net.ListenPacket("udp4", ":5568") if err != nil { 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) - // Join multicast groups for each universe for _, u := range universes { 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 { - // Try joining on all interfaces - ifaces, _ := net.Interfaces() - for _, iface := range ifaces { - p.JoinGroup(&iface, &net.UDPAddr{IP: group}) - } + c.Close() + return nil, err } }