Самый простой способ - использовать оболочку ListenMulticastUDP в пакете net
, как на самом деле уже объяснялось в другом ответе SO, на который вы указываете, Как установить IP_MULTICAST_L OOP в многоадресной рассылке UDPConn в Golang.
Если вы будете следовать реализации ListenMulticastUDP()
, вы увидите, что в определенный момент она вызывает setIPv4MulticastLoopback(fd, false)
.
Если вам нужно что-то еще дополнительно, документация ListenMulticastUDP()
предлагает взглянуть на https://godoc.org/golang.org/x/net/ipv4 и https://godoc.org/golang.org/x/net/ipv6, которые подробно описывают, как делать многоадресную рассылку в Go.
Вот некоторый минимальный код (протестированный на MacOS, но независимый от платформы), который показывает, как использовать ListenMulticastUDP()
:
func main() {
// MDNS (https://en.wikipedia.org/wiki/Multicast_DNS)
groupAddress := "224.0.0.251:5353"
ifaceName := "en0"
if err := run(groupAddress, ifaceName); err != nil {
fmt.Fprintln(os.Stderr, "error:", err)
os.Exit(1)
}
}
func run(groupAddr string, ifaceName string) error {
iface, err := net.InterfaceByName(ifaceName)
if err != nil {
return err
}
gaddr, err := net.ResolveUDPAddr("udp", groupAddr)
if err != nil {
return err
}
conn, err := net.ListenMulticastUDP("udp", iface, gaddr)
if err != nil {
return err
}
buf := make([]byte, 1024)
for {
n, addr, err := conn.ReadFromUDP(buf)
if err != nil {
return err
}
fmt.Printf("recv %4d bytes from %v\n", n, addr)
}
}