diff --git a/client_udp_listener.go b/client_udp_listener.go index 4ba0e0a6..0d90030f 100644 --- a/client_udp_listener.go +++ b/client_udp_listener.go @@ -2,7 +2,6 @@ package gortsplib import ( "crypto/rand" - "fmt" "math/big" "net" "strconv" @@ -25,35 +24,6 @@ func randInRange(max int) (int, error) { return int(n.Int64()), nil } -func findMulticastInterfaceForSource(ip net.IP) (*net.Interface, error) { - if ip.Equal(net.ParseIP("127.0.0.1")) { - return nil, fmt.Errorf("IP 127.0.0.1 can't be used as source of a multicast stream. Use the LAN IP of your PC") - } - - intfs, err := net.Interfaces() - if err != nil { - return nil, err - } - - for _, intf := range intfs { - if (intf.Flags & net.FlagMulticast) == 0 { - continue - } - - addrs, err := intf.Addrs() - if err == nil { - for _, addr := range addrs { - _, ipnet, err := net.ParseCIDR(addr.String()) - if err == nil && ipnet.Contains(ip) { - return &intf, nil - } - } - } - } - - return nil, fmt.Errorf("found no interface that is multicast-capable and can communicate with IP %v", ip) -} - type clientUDPListener struct { c *Client pc net.PacketConn @@ -118,7 +88,7 @@ func newClientUDPListener( ) (*clientUDPListener, error) { var pc packetConn if multicastEnable { - intf, err := findMulticastInterfaceForSource(multicastSourceIP) + intf, err := multicast.InterfaceForSource(multicastSourceIP) if err != nil { return nil, err } diff --git a/pkg/multicast/multicast.go b/pkg/multicast/multicast.go index a94d4fdd..ae8221ef 100644 --- a/pkg/multicast/multicast.go +++ b/pkg/multicast/multicast.go @@ -2,6 +2,7 @@ package multicast import ( + "fmt" "net" ) @@ -10,3 +11,33 @@ type Conn interface { net.PacketConn SetReadBuffer(int) error } + +// InterfaceForSource returns a multicast-capable interface that can communicate with given IP. +func InterfaceForSource(ip net.IP) (*net.Interface, error) { + if ip.Equal(net.ParseIP("127.0.0.1")) { + return nil, fmt.Errorf("IP 127.0.0.1 can't be used as source of a multicast stream. Use the LAN IP of your PC") + } + + intfs, err := net.Interfaces() + if err != nil { + return nil, err + } + + for _, intf := range intfs { + if (intf.Flags & net.FlagMulticast) == 0 { + continue + } + + addrs, err := intf.Addrs() + if err == nil { + for _, addr := range addrs { + _, ipnet, err := net.ParseCIDR(addr.String()) + if err == nil && ipnet.Contains(ip) { + return &intf, nil + } + } + } + } + + return nil, fmt.Errorf("found no interface that is multicast-capable and can communicate with IP %v", ip) +}