main.go raw

   1  package main
   2  
   3  import (
   4  	"fmt"
   5  	"net"
   6  	"time"
   7  	
   8  	"golang.org/x/net/ipv4"
   9  )
  10  
  11  var ipv4Addr = &net.UDPAddr{IP: net.IPv4(224, 0, 0, 1), Port: 1234}
  12  
  13  func main() {
  14  	conn, e := net.ListenUDP("udp4", ipv4Addr)
  15  	if e != nil {
  16  		fmt.Printf("ListenUDP error %v\n", e)
  17  		return
  18  	}
  19  	
  20  	pc := ipv4.NewPacketConn(conn)
  21  	var ifaces []net.Interface
  22  	var iface net.Interface
  23  	if ifaces, e = net.Interfaces(); E.Chk(e) {
  24  	}
  25  	// This grabs the first physical interface with multicast that is up
  26  	for i := range ifaces {
  27  		if ifaces[i].Flags&net.FlagMulticast != 0 &&
  28  			ifaces[i].Flags&net.FlagUp != 0 &&
  29  			ifaces[i].HardwareAddr != nil {
  30  			iface = ifaces[i]
  31  			break
  32  		}
  33  	}
  34  	if e = pc.JoinGroup(&iface, &net.UDPAddr{IP: net.IPv4(224, 0, 0, 1)}); E.Chk(e) {
  35  		return
  36  	}
  37  	// test
  38  	var loop bool
  39  	if loop, e = pc.MulticastLoopback(); e == nil {
  40  		fmt.Printf("MulticastLoopback status:%v\n", loop)
  41  		if !loop {
  42  			if e = pc.SetMulticastLoopback(true); E.Chk(e) {
  43  				fmt.Printf("SetMulticastLoopback error:%v\n", e)
  44  			}
  45  		}
  46  	}
  47  	go func() {
  48  		for {
  49  			if _, e = conn.WriteTo([]byte("hello"), ipv4Addr); E.Chk(e) {
  50  				fmt.Printf("Write failed, %v\n", e)
  51  			}
  52  			time.Sleep(time.Second)
  53  		}
  54  	}()
  55  	
  56  	buf := make([]byte, 1024)
  57  	for {
  58  		if n, addr, e := conn.ReadFrom(buf); E.Chk(e) {
  59  			fmt.Printf("error %v", e)
  60  		} else {
  61  			fmt.Printf("recv %s from %v\n", string(buf[:n]), addr)
  62  		}
  63  	}
  64  	
  65  	// return
  66  }
  67  
  68  //
  69  // func main() {
  70  // 	var ifs []net.Interface
  71  // 	var e error
  72  // 	if ifs, e = net.Interfaces(); E.Chk(e) {
  73  // 	}
  74  // 	D.S(ifs)
  75  // 	var addrs []net.Addr
  76  // 	var addr net.Addr
  77  // 	for i := range ifs {
  78  // 		if ifs[i].Flags&net.FlagUp != 0 && ifs[i].Flags&net.FlagMulticast != 0 {
  79  // 			if addrs, e = ifs[i].MulticastAddrs(); E.Chk(e) {
  80  // 			}
  81  // 			for j := range addrs {
  82  // 				if addrs[j].String() == Multicast {
  83  // 					addr = addrs[j]
  84  // 					break
  85  // 				}
  86  // 			}
  87  // 		}
  88  // 	}
  89  // 	D.S(addr)
  90  // }
  91