mirror of
https://github.com/lucheng0127/virtuallan.git
synced 2025-10-07 01:33:15 +08:00
70 lines
1.0 KiB
Go
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)
|
|
}
|
|
}
|