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  }