@@ -22,13 +22,23 @@ type MulticastServer struct {
2222func NewMulticastServer (multicastAddress string ) (r * MulticastServer ) {
2323 r = new (MulticastServer )
2424 r .multicastAddress = multicastAddress
25- r .Consumer = func ([]byte , * net.UDPAddr ) {}
25+ r .Consumer = func ([]byte , * net.UDPAddr ) {
26+ // noop by default
27+ }
2628 return
2729}
2830
2931func (r * MulticastServer ) Start () {
3032 r .running = true
31- go r .receive (r .multicastAddress )
33+
34+ ifis := interfaces (r .SkipInterfaces )
35+ var ifiNames []string
36+ for _ , ifi := range ifis {
37+ ifiNames = append (ifiNames , ifi .Name )
38+ }
39+ log .Printf ("Listening on %s %s" , r .multicastAddress , ifiNames )
40+
41+ go r .receive ()
3242}
3343
3444func (r * MulticastServer ) Stop () {
@@ -40,14 +50,13 @@ func (r *MulticastServer) Stop() {
4050 }
4151}
4252
43- func (r * MulticastServer ) receive (multicastAddress string ) {
44- log .Printf ("Receiving multicast traffic on %v" , multicastAddress )
53+ func (r * MulticastServer ) receive () {
4554 var currentIfiIdx = 0
4655 for r .isRunning () {
47- ifis := r . interfaces ()
56+ ifis := interfaces (r . SkipInterfaces )
4857 currentIfiIdx = currentIfiIdx % len (ifis )
4958 ifi := ifis [currentIfiIdx ]
50- r .receiveOnInterface (multicastAddress , ifi )
59+ r .receiveOnInterface (ifi )
5160 currentIfiIdx ++
5261 if currentIfiIdx >= len (ifis ) {
5362 // cycled though all interfaces once, make a short break to avoid producing endless log messages
@@ -62,51 +71,37 @@ func (r *MulticastServer) isRunning() bool {
6271 return r .running
6372}
6473
65- func (r * MulticastServer ) interfaces () (interfaces []net.Interface ) {
66- interfaces = []net.Interface {}
67- ifis , err := net .Interfaces ()
68- if err != nil {
69- log .Println ("Could not get available interfaces: " , err )
70- }
71- for _ , ifi := range ifis {
72- if ifi .Flags & net .FlagMulticast == 0 || // No multicast support
73- r .skipInterface (ifi .Name ) {
74- continue
75- }
76- interfaces = append (interfaces , ifi )
77- }
78- return
79- }
80-
81- func (r * MulticastServer ) skipInterface (ifiName string ) bool {
82- for _ , skipIfi := range r .SkipInterfaces {
83- if skipIfi == ifiName {
84- return true
85- }
86- }
87- return false
88- }
89-
90- func (r * MulticastServer ) receiveOnInterface (multicastAddress string , ifi net.Interface ) {
91- addr , err := net .ResolveUDPAddr ("udp" , multicastAddress )
74+ func (r * MulticastServer ) connectToInterface (ifi net.Interface ) bool {
75+ addr , err := net .ResolveUDPAddr ("udp" , r .multicastAddress )
9276 if err != nil {
93- log .Printf ("Could resolve multicast address %v: %v" , multicastAddress , err )
94- return
77+ log .Printf ("Could resolve multicast address %v: %v" , r . multicastAddress , err )
78+ return false
9579 }
9680
9781 r .connection , err = net .ListenMulticastUDP ("udp" , & ifi , addr )
9882 if err != nil {
99- log .Printf ("Could not listen at %v: %v" , multicastAddress , err )
100- return
83+ log .Printf ("Could not listen at %v on %v : %v" , r . multicastAddress , ifi . Name , err )
84+ return false
10185 }
10286
10387 if err := r .connection .SetReadBuffer (maxDatagramSize ); err != nil {
10488 log .Println ("Could not set read buffer: " , err )
10589 }
10690
10791 if r .Verbose {
108- log .Printf ("Listening on %s (%s)" , multicastAddress , ifi .Name )
109- defer log .Printf ("Stop listening on %s (%s)" , multicastAddress , ifi .Name )
92+ log .Printf ("Listening on %s (%s)" , r .multicastAddress , ifi .Name )
93+ }
94+
95+ return true
96+ }
97+
98+ func (r * MulticastServer ) receiveOnInterface (ifi net.Interface ) {
99+ if ! r .connectToInterface (ifi ) {
100+ return
101+ }
102+
103+ if r .Verbose {
104+ defer log .Printf ("Stop listening on %s (%s)" , r .multicastAddress , ifi .Name )
110105 }
111106
112107 first := true
@@ -120,14 +115,23 @@ func (r *MulticastServer) receiveOnInterface(multicastAddress string, ifi net.In
120115 if r .Verbose {
121116 log .Println ("ReadFromUDP failed:" , err )
122117 }
123- return
118+ break
124119 }
125120
126- if first {
127- log .Printf ("Got first data packets from %s (%s)" , multicastAddress , ifi .Name )
121+ if first && r . Verbose {
122+ log .Printf ("Got first data packets from %s (%s)" , r . multicastAddress , ifi .Name )
128123 first = false
129124 }
130125
131126 r .Consumer (data [:n ], remoteAddr )
132127 }
128+
129+ if r .Verbose {
130+ log .Printf ("Stop listening on %s (%s)" , r .multicastAddress , ifi .Name )
131+ }
132+
133+ if err := r .connection .Close (); err != nil {
134+ log .Println ("Could not close listener: " , err )
135+ }
136+ return
133137}
0 commit comments