github.com/qiuhoude/go-web@v0.0.0-20220223060959-ab545e78f20d/prepare/00_net/udp/example_3/group.go (about) 1 package main 2 3 import ( 4 "fmt" 5 "github.com/prometheus/common/log" 6 "golang.org/x/net/ipv4" 7 "net" 8 ) 9 10 // 组播的例子 11 func main() { 12 //interfaces, _ := net.Interfaces() // 获取机器网卡 13 //for i := range interfaces { 14 // fmt.Println(interfaces[i]) 15 //} 16 //1. 得到一个interface 17 en4, err := net.InterfaceByName("以太网") 18 if err != nil { 19 log.Fatal(err) 20 } 21 group := net.IPv4(224, 0, 0, 250) 22 23 //2. bind一个本地地址 24 c, err := net.ListenPacket("udp4", "0.0.0.0:1024") 25 if err != nil { 26 log.Fatal(err) 27 } 28 defer c.Close() 29 30 // 3. 31 p := ipv4.NewPacketConn(c) 32 if err := p.JoinGroup(en4, &net.UDPAddr{IP: group}); err != nil { 33 fmt.Println(err) 34 } 35 36 //4.更多的控制 37 if err := p.SetControlMessage(ipv4.FlagDst, true); err != nil { 38 fmt.Println(err) 39 } 40 //5.接收消息 41 b := make([]byte, 1500) 42 for { 43 n, cm, src, err := p.ReadFrom(b) 44 if err != nil { 45 fmt.Println(err) 46 } 47 if cm.Dst.IsMulticast() { 48 if cm.Dst.Equal(group) { 49 fmt.Printf("received: %s from <%s>\n", b[:n], src) 50 n, err = p.WriteTo([]byte("world"), cm, src) 51 if err != nil { 52 fmt.Println(err) 53 } 54 } else { 55 fmt.Println("Unknown group") 56 continue 57 } 58 } 59 } 60 61 }