57 lines
903 B
Go
57 lines
903 B
Go
package fcast
|
|
|
|
import (
|
|
"github.com/hashicorp/mdns"
|
|
"log"
|
|
)
|
|
|
|
type DiscoveredHost struct {
|
|
Name string
|
|
IPv4 string
|
|
IPv6 string
|
|
}
|
|
|
|
func Discover() ([]DiscoveredHost, error) {
|
|
|
|
entriesCh := make(chan *mdns.ServiceEntry)
|
|
var discoveredHosts []DiscoveredHost
|
|
|
|
go func() {
|
|
for entry := range entriesCh {
|
|
if !validateEntry(entry) {
|
|
continue
|
|
}
|
|
discoveredHosts = append(discoveredHosts, DiscoveredHost{
|
|
Name: entry.Name,
|
|
IPv4: entry.AddrV4.String(),
|
|
IPv6: entry.AddrV6.String(),
|
|
})
|
|
}
|
|
}()
|
|
|
|
done := make(chan struct{})
|
|
go func() {
|
|
err := mdns.Lookup("_fcast._tcp", entriesCh)
|
|
if err != nil {
|
|
log.Println("[ERROR] mdns: lookup error:", err)
|
|
}
|
|
close(entriesCh)
|
|
close(done)
|
|
}()
|
|
|
|
select {
|
|
case <-done:
|
|
return discoveredHosts, nil
|
|
}
|
|
|
|
}
|
|
|
|
func validateEntry(entry *mdns.ServiceEntry) bool {
|
|
|
|
if entry.Port != DefaultPort {
|
|
return false
|
|
}
|
|
|
|
return true
|
|
|
|
}
|