package multicast
import (
"net"
)
type InterfacesProviderFunc func () []net .Interface
var InterfacesProvider InterfacesProviderFunc
var SystemAssignedInterface bool = false
func interfaces() ([]net .Interface , error ) {
if p := InterfacesProvider ; p != nil {
if list := p (); len (list ) > 0 {
return list , nil
}
}
return interfacesIPv4 ()
}
func interfacesIPv4() ([]net .Interface , error ) {
iflist , err := net .Interfaces ()
if err != nil {
return nil , err
}
list := make ([]net .Interface , 0 , len (iflist ))
for _ , ifi := range iflist {
if !hasLinkUp (&ifi ) || !hasMulticast (&ifi ) || !hasIPv4Address (&ifi ) {
continue
}
list = append (list , ifi )
}
return list , nil
}
func hasLinkUp(ifi *net .Interface ) bool {
return ifi .Flags &net .FlagUp != 0
}
func hasMulticast(ifi *net .Interface ) bool {
return ifi .Flags &net .FlagMulticast != 0
}
func hasIPv4Address(ifi *net .Interface ) bool {
addrs , err := ifi .Addrs ()
if err != nil {
return false
}
for _ , a := range addrs {
ip , _ , err := net .ParseCIDR (a .String ())
if err != nil {
continue
}
if len (ip .To4 ()) == net .IPv4len && !ip .IsUnspecified () {
return true
}
}
return false
}
The pages are generated with Golds v0.8.2 . (GOOS=linux GOARCH=amd64)
Golds is a Go 101 project developed by Tapir Liu .
PR and bug reports are welcome and can be submitted to the issue list .
Please follow @zigo_101 (reachable from the left QR code) to get the latest news of Golds .