Files
virtuallan/demo/multicast/main.go
2024-06-17 09:55:11 +08:00

70 lines
1.0 KiB
Go

package main
import (
"fmt"
"net"
"time"
)
const (
SVC_ADDR = "224.0.0.1:9000"
MAX_DATA_SIZE = 8192
)
func ping(addr string) {
udpAddr, err := net.ResolveUDPAddr("udp", addr)
if err != nil {
panic(err)
}
c, err := net.DialUDP("udp", nil, udpAddr)
if err != nil {
panic(err)
}
idx := 0
for {
idx++
msg := fmt.Sprintf("ping %d", idx)
_, err := c.Write([]byte(msg))
if err != nil {
panic(err)
}
time.Sleep(3 * time.Second)
}
}
func listenMulticast(addr string) error {
udpAddr, err := net.ResolveUDPAddr("udp", addr)
if err != nil {
return err
}
// Listen multicast on all network interface
ln, err := net.ListenMulticastUDP("udp", nil, udpAddr)
if err != nil {
return err
}
for {
buf := make([]byte, MAX_DATA_SIZE)
n, srcAddr, err := ln.ReadFromUDP(buf)
if err != nil {
return err
}
fmt.Printf("read %s from %s\n", string(buf[:n]), srcAddr.String())
fmt.Println("")
}
}
func main() {
go ping(SVC_ADDR)
if err := listenMulticast(SVC_ADDR); err != nil {
panic(err)
}
}