Bind interface for sACN receiver multicast group joins
This commit is contained in:
2
main.go
2
main.go
@@ -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)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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})
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user