// Copyright 2016 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package net import ( "internal/testenv" "runtime" "testing" ) func TestListenMulticastUDP(t *testing.T) { testenv.MustHaveExternalNetwork(t) ifcs, err := Interfaces() if err != nil { t.Skip(err.Error()) } if len(ifcs) == 0 { t.Skip("no network interfaces found") } var mifc *Interface for _, ifc := range ifcs { if ifc.Flags&FlagUp|FlagMulticast != FlagUp|FlagMulticast { continue } mifc = &ifc break } if mifc == nil { t.Skipf("no multicast interfaces found") } c1, err := ListenMulticastUDP("udp4", mifc, &UDPAddr{IP: ParseIP("224.0.0.254")}) if err != nil { t.Fatalf("multicast not working on %s: %v", runtime.GOOS, err) } c1addr := c1.LocalAddr().(*UDPAddr) if err != nil { t.Fatal(err) } defer c1.Close() c2, err := ListenUDP("udp4", &UDPAddr{IP: IPv4zero, Port: 0}) c2addr := c2.LocalAddr().(*UDPAddr) if err != nil { t.Fatal(err) } defer c2.Close() n, err := c2.WriteToUDP([]byte("data"), c1addr) if err != nil { t.Fatal(err) } if n != 4 { t.Fatalf("got %d; want 4", n) } n, err = c1.WriteToUDP([]byte("data"), c2addr) if err != nil { t.Fatal(err) } if n != 4 { t.Fatalf("got %d; want 4", n) } }