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