|  | // 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) | 
|  | } | 
|  | } |